Compare commits

..

31 Commits

Author SHA1 Message Date
5c0036acfd fix(other): bug修复
Some checks failed
CI Build & Upload (WeApp) / build-upload-dev (push) Failing after 2m31s
CI Build & Upload (WeApp) / build-upload-prod (push) Has been skipped
CI Build & Upload (WeApp) / build-upload-reserve (push) Has been skipped
2026-01-10 21:30:50 +08:00
2c38893c43 fix(components): 修复搜索页样式错乱
Some checks failed
CI Build & Upload (WeApp) / build-upload-dev (push) Failing after 3m58s
CI Build & Upload (WeApp) / build-upload-prod (push) Has been skipped
CI Build & Upload (WeApp) / build-upload-reserve (push) Has been skipped
2025-12-03 01:17:06 +08:00
a30d3572a5 feat(projects): 首页主备优化
All checks were successful
CI Build & Upload (WeApp) / build-upload-dev (push) Has been skipped
CI Build & Upload (WeApp) / build-upload-prod (push) Successful in 6m43s
CI Build & Upload (WeApp) / build-upload-reserve (push) Successful in 2m25s
2025-12-02 23:57:04 +08:00
b6b6649a9b ci(other): ci脚本换源
All checks were successful
CI Build & Upload (WeApp) / build-upload-dev (push) Has been skipped
CI Build & Upload (WeApp) / build-upload-prod (push) Successful in 4m55s
CI Build & Upload (WeApp) / build-upload-reserve (push) Successful in 2m34s
2025-11-05 11:56:16 +08:00
985c8fa766 release(other): 4.0.15
Some checks failed
CI Build & Upload (WeApp) / build-upload-prod (push) Has been cancelled
CI Build & Upload (WeApp) / build-upload-reserve (push) Has been cancelled
CI Build & Upload (WeApp) / build-upload-dev (push) Has been cancelled
2025-11-05 11:32:38 +08:00
ef380ff569 release(other): 4.0.14
Some checks failed
CI Build & Upload (WeApp) / build-upload-dev (push) Has been skipped
CI Build & Upload (WeApp) / build-upload-prod (push) Failing after 4m44s
CI Build & Upload (WeApp) / build-upload-reserve (push) Successful in 19m24s
2025-10-31 19:15:29 +08:00
63b61bbc98 ci(other): ci update 2025-10-31 19:13:49 +08:00
d831ee932b release: 临时紧急版本
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-29 12:39:01 +08:00
8b55419643 fix(依赖升级,bug 修复):
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-13 16:26:39 +08:00
f567cf7c94 build(deps): 依赖升级 2025-09-13 03:26:33 +08:00
e1c00d6bb1 style(custom): ok
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-20 07:52:00 +08:00
9edcf67620 style(custom): add eslint rules
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-18 21:46:34 +08:00
8ca7001e3f feat(custom): 商家详情整改增加未登录引导弹窗
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-18 21:43:16 +08:00
6f5d722e6e refactor(custom): 登录页面增加显式返回键
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-16 23:17:57 +08:00
6ca3669950 refactor(custom): 地图服务商更换
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-16 17:51:31 +08:00
54b1d4b07c refactor(custom): 地图Key变更
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-29 16:00:15 +08:00
896acaef9e feat(custom): 地图apiKey更换,订单核销详情新增支付方式
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-29 15:45:16 +08:00
92d7bf1933 feat(custom): 订单核销新增最近核销
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-30 08:26:26 +08:00
9af020af37 ci(custom): update
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-18 16:17:30 +08:00
e7fc232ba7 ci(custom): update
Some checks failed
continuous-integration/drone/push Build is failing
2025-03-18 15:53:37 +08:00
2b2e8ae481 ci(custom): update
Some checks failed
continuous-integration/drone/push Build is failing
2025-03-18 15:52:08 +08:00
8ece6b24e8 refactor(custom): 核销弹窗更改
Some checks reported errors
continuous-integration/drone/push Build encountered an error
2025-03-18 15:44:57 +08:00
b475228705 ci(custom): update
Some checks failed
continuous-integration/drone/push Build is failing
2025-02-13 16:42:06 +08:00
05caf08c47 build(deps): taro升级至4.0.9
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-02-12 11:15:51 +08:00
7096e38967 release(custom): 4.0.7
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-06 17:07:17 +08:00
3926922925 mod(custom): 增加公告弹窗
All checks were successful
continuous-integration/drone/push Build is passing
2024-12-30 19:59:00 +08:00
90f1764e7b refactor(custom): 暂时取消游戏进入限制
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-19 04:32:05 +08:00
52e49cca6c fix(projects): env
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-19 02:51:53 +08:00
72705cb101 feat(custom): 增加没有豆子不可进入游戏
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-18 22:56:23 +08:00
7eed620962 feat(custom): 游戏大厅合并
All checks were successful
continuous-integration/drone/push Build is passing
2024-11-18 22:49:00 +08:00
a0e7966ee4 feat(custom): 新增商家订单管理筛选
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-21 17:32:26 +08:00
113 changed files with 2652 additions and 2896 deletions

8
.cursorignore Normal file
View File

@@ -0,0 +1,8 @@
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
/dist
/node_modules
/pnpm-store
/dist.tar
/dist.tar.gz
/dist.tar.gz.part

View File

@@ -1,8 +1,8 @@
module.exports = { module.exports = {
types: [ types: [
{value: 'feat', name: 'feat: 新增功能'}, { value: 'feat', name: 'feat: 新增功能' },
{value: 'fix', name: 'fix: 修复bug'}, { value: 'fix', name: 'fix: 修复bug' },
{value: 'docs', name: 'docs: 文档变更'}, { value: 'docs', name: 'docs: 文档变更' },
{ {
value: 'style', value: 'style',
name: 'style: 代码格式(不影响功能,例如空格、分号等格式修正)', name: 'style: 代码格式(不影响功能,例如空格、分号等格式修正)',
@@ -11,21 +11,21 @@ module.exports = {
value: 'refactor', value: 'refactor',
name: 'refactor: 代码重构(不包括 bug 修复、功能新增)', name: 'refactor: 代码重构(不包括 bug 修复、功能新增)',
}, },
{value: 'perf', name: 'perf: 性能优化'}, { value: 'perf', name: 'perf: 性能优化' },
{value: 'test', name: 'test: 添加、修改测试用例'}, { value: 'test', name: 'test: 添加、修改测试用例' },
{ {
value: 'build', value: 'build',
name: 'build: 构建流程、外部依赖变更(如升级 npm 包、修改 脚手架 配置等)', name: 'build: 构建流程、外部依赖变更(如升级 npm 包、修改 脚手架 配置等)',
}, },
{value: 'ci', name: 'ci: 修改 CI 配置、脚本'}, { value: 'ci', name: 'ci: 修改 CI 配置、脚本' },
{ {
value: 'chore', value: 'chore',
name: 'chore: 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)', name: 'chore: 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)',
}, },
{value: 'revert', name: 'revert: 回滚 commit'}, { value: 'revert', name: 'revert: 回滚 commit' },
{value: 'wip', name: 'wip: 开发中'}, { value: 'wip', name: 'wip: 开发中' },
{value: 'mod', name: 'mod: 不确定分类的修改'}, { value: 'mod', name: 'mod: 不确定分类的修改' },
{value: 'release', name: 'release: 发布'}, { value: 'release', name: 'release: 发布' },
], ],
scopes: [ scopes: [
['custom', '自定义'], ['custom', '自定义'],

View File

@@ -1,64 +0,0 @@
kind: pipeline
type: docker
name: default
platform:
os: linux
arch: amd64
steps:
- name: 测试服-依赖安装&&编译打包&&上传微信小程序平台
pull: if-not-exists
image: node:20-alpine
when:
branch:
- test
commands:
- npm config set registry https://registry.npmmirror.com/
- npm install -g pnpm
- pnpm install
- pnpm build:weapp:test:upload
- rm -rf dist.tar
- rm -rf node_modules
- name: 正式服-依赖安装&&编译打包&&上传微信小程序平台
pull: if-not-exists
image: node:20-alpine
when:
branch:
- master
commands:
- npm config set registry https://registry.npmmirror.com/
- npm install -g pnpm
- pnpm install
- pnpm build:weapp:prod:upload
- rm -rf dist.tar
- rm -rf node_modules
- name: 企业微信通知
pull: if-not-exists
image: plugins/webhook
when:
branch:
- test
- master
status:
- success
- failure
settings:
urls: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a2065e21-4f92-4f5b-a432-2c0cd1d965b5
content_type: application/json
template: |
{
"msgtype": "markdown",
"markdown": {
"content": "{{#success build.status}}✅{{else}}❌{{/success}}**{{ repo.owner }}/{{ repo.name }}** (Build #{{build.number}})\n
>**构建结果**: {{ build.status }}
>**构建详情**: [点击查看]({{ build.link }})
>**代码分支**: {{ build.branch }}
>**提交标识**: {{ build.commit }}
>**提交发起**: {{ build.author }}
>**提交信息**: {{ build.message }}
"
}
}

View File

@@ -2,14 +2,17 @@
TARO_APP_ID='wx7b3322daa2cf9c88' TARO_APP_ID='wx7b3322daa2cf9c88'
# 开发版appkey # 开发版appkey
TARO_APP_KEY='1234567890' TARO_APP_KEY=''
# API接口 # API接口
TARO_APP_API='https://test.wanzhuanyongcheng.cn/app' TARO_APP_API='https://test.wanzhuanyongcheng.cn/app'
# 骰子游戏链接
TARO_APP_GAME='https://jdt-test-tz.wanzhuanyongcheng.cn/pages/index/index?uid='
# TARO_APP_GAME='http://192.168.31.225:10086?uid='
# 捕鱼游戏链接 # 版权文字
TARO_APP_FISH_GAME='https://jdt-test-fish.wanzhuanyongcheng.cn/?uid=' TARO_APP_NAME='捷兑通'
TARO_APP_COP='玩赚商城版权所有'
TARO_APP_TITLE_IMG='../../../static/index/1.png'
TARO_APP_LOGO_IMG='../../../static/logo.jpg'
TARO_APP_SHOW_NEW_HOME='no'

View File

@@ -1,13 +1,19 @@
# 正式版appid # 正式版appid
TARO_APP_ID='wxdd00d46fa6f07974' TARO_APP_ID='wxdd00d46fa6f07974'
# 开发版appkey # 正式版appkey
TARO_APP_KEY='private.wxdd00d46fa6f07974.key' TARO_APP_KEY='private.wxdd00d46fa6f07974.key'
# API接口 # API接口
TARO_APP_API='https://www.wanzhuanyongcheng.cn/app' TARO_APP_API='https://www.wanzhuanyongcheng.cn/app'
TARO_APP_GAME='https://jdt-prod-tz.wanzhuanyongcheng.cn/pages/index/index?uid='
# 捕鱼游戏链接 # 版权文字
TARO_APP_FISH_GAME='https://jdt-prod-fish.wanzhuanyongcheng.cn/?uid=' TARO_APP_NAME='捷兑通'
TARO_APP_COP='鑫瓴科技版权所有'
TARO_APP_TITLE_IMG='../../../static/index/1.png'
TARO_APP_LOGO_IMG='../../../static/logo.jpg'
TARO_APP_SHOW_NEW_HOME='no'

18
.env.reserve Normal file
View File

@@ -0,0 +1,18 @@
# 备用版appid
TARO_APP_ID='wx4a9380d8bb16d9de'
# 备用版appkey
TARO_APP_KEY='private.wx4a9380d8bb16d9de.key'
# API接口
TARO_APP_API='https://api.gxwzwh.com/app'
# 版权文字
TARO_APP_NAME='玩赚商城'
TARO_APP_COP='玩赚商城版权所有'
TARO_APP_TITLE_IMG='../../../static/index/title.png'
TARO_APP_LOGO_IMG='../../../static/logo-1.jpg'
TARO_APP_SHOW_NEW_HOME='yes'

View File

@@ -7,8 +7,12 @@ TARO_APP_KEY='private.wx7b3322daa2cf9c88.key'
# API接口 # API接口
TARO_APP_API='https://test.wanzhuanyongcheng.cn/app' TARO_APP_API='https://test.wanzhuanyongcheng.cn/app'
# 游戏链接
TARO_APP_GAME='https://jdt-test-tz.wanzhuanyongcheng.cn/pages/index/index?uid='
# 捕鱼游戏链接 # 版权文字
TARO_APP_FISH_GAME='https://jdt-test-fish.wanzhuanyongcheng.cn/?uid=' TARO_APP_NAME='捷兑通'
TARO_APP_COP='鑫瓴科技版权所有'
TARO_APP_TITLE_IMG='../../static/index/1.png'
TARO_APP_LOGO_IMG='../../../static/logo.jpg'
TARO_APP_SHOW_NEW_HOME='no'

4
.eslintignore Normal file
View File

@@ -0,0 +1,4 @@
/node_modules/**
/dist/*
/public/*
/src/static/*

126
.gitea/workflows/ci.yaml Normal file
View File

@@ -0,0 +1,126 @@
name: CI Build & Upload (WeApp)
on:
push:
branches:
- test
- master
jobs:
build-upload-dev:
if: ${{ gitea.ref == 'refs/heads/test' }}
runs-on: gitea_act_runner
container:
image: node:24-alpine
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install deps
run: |
npm install -g pnpm
pnpm config set registry https://registry.npmmirror.com/
pnpm install
- name: Build & Upload (test)
run: |
pnpm build:weapp:test:upload
rm -rf dist.tar || true
- name: Notify WeCom (Dev)
if: always()
env:
WEBHOOK_KEY: ${{ secrets.QYWX_WEBHOOK_KEY }}
STATUS: ${{ job.status }}
REPO: ${{ gitea.repository }}
RUN_URL: ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}
BRANCH: ${{ gitea.ref_name }}
COMMIT: ${{ gitea.sha }}
ACTOR: ${{ gitea.actor }}
COMMIT_MSG: ${{ gitea.event.head_commit.message }}
run: |
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk add --no-cache curl jq
EMOJI=$( [ "$STATUS" = "success" ] && echo "✅ 构建成功" || echo "❌ 构建失败" )
MSG="$(printf "%s\n**项目**: %s (构建 #%s)\n**分支**: %s\n**提交**: %s\n**作者**: %s\n**信息**: %s\n**详情**: [查看构建详情](%s)" \
"$EMOJI" "$REPO" "${{ gitea.run_number }}" "$BRANCH" "$COMMIT" "$ACTOR" "$(echo "$COMMIT_MSG" | tr '\n' ' ' | tr -s ' ')" "$RUN_URL")"
JSON=$(jq -n --arg content "$MSG" '{msgtype:"markdown", markdown:{content:$content}}')
curl -sS -H 'Content-Type: application/json' -d "$JSON" "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WEBHOOK_KEY}"
build-upload-prod:
if: ${{ gitea.ref == 'refs/heads/master' }}
runs-on: gitea_act_runner
container:
image: node:24-alpine
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install deps
run: |
npm install -g pnpm
pnpm config set registry https://registry.npmmirror.com/
pnpm install
- name: Build & Upload (prod)
run: |
pnpm build:weapp:prod:upload
rm -rf dist.tar || true
- name: Notify WeCom (Prod)
if: always()
env:
WEBHOOK_KEY: ${{ secrets.QYWX_WEBHOOK_KEY }}
STATUS: ${{ job.status }}
REPO: ${{ gitea.repository }}
RUN_URL: ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}
BRANCH: ${{ gitea.ref_name }}
COMMIT: ${{ gitea.sha }}
ACTOR: ${{ gitea.actor }}
COMMIT_MSG: ${{ gitea.event.head_commit.message }}
run: |
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk add --no-cache curl jq
EMOJI=$( [ "$STATUS" = "success" ] && echo "✅ 构建成功" || echo "❌ 构建失败" )
MSG="$(printf "%s\n**项目**: %s (构建 #%s)\n**分支**: %s\n**提交**: %s\n**作者**: %s\n**信息**: %s\n**详情**: [查看构建详情](%s)" \
"$EMOJI" "$REPO" "${{ gitea.run_number }}" "$BRANCH" "$COMMIT" "$ACTOR" "$(echo "$COMMIT_MSG" | tr '\n' ' ' | tr -s ' ')" "$RUN_URL")"
JSON=$(jq -n --arg content "$MSG" '{msgtype:"markdown", markdown:{content:$content}}')
curl -sS -H 'Content-Type: application/json' -d "$JSON" "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WEBHOOK_KEY}"
build-upload-reserve:
if: ${{ gitea.ref == 'refs/heads/master' }}
runs-on: gitea_act_runner
container:
image: node:24-alpine
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install deps
run: |
npm install -g pnpm
pnpm config set registry https://registry.npmmirror.com/
pnpm install
- name: Build & Upload (reserve)
run: |
pnpm build:weapp:reserve:upload
rm -rf dist.tar || true
- name: Notify WeCom (Reserve)
if: always()
env:
WEBHOOK_KEY: ${{ secrets.QYWX_WEBHOOK_KEY }}
STATUS: ${{ job.status }}
REPO: ${{ gitea.repository }}
RUN_URL: ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}
BRANCH: ${{ gitea.ref_name }}
COMMIT: ${{ gitea.sha }}
ACTOR: ${{ gitea.actor }}
COMMIT_MSG: ${{ gitea.event.head_commit.message }}
run: |
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories || true
apk add --no-cache curl jq
EMOJI=$( [ "$STATUS" = "success" ] && echo "✅ 构建成功" || echo "❌ 构建失败" )
MSG="$(printf "%s\n**项目**: %s (构建 #%s)\n**分支**: %s\n**提交**: %s\n**作者**: %s\n**信息**: %s\n**详情**: [查看构建详情](%s)" \
"$EMOJI" "$REPO" "${{ gitea.run_number }}" "$BRANCH" "$COMMIT" "$ACTOR" "$(echo "$COMMIT_MSG" | tr '\n' ' ' | tr -s ' ')" "$RUN_URL")"
JSON=$(jq -n --arg content "$MSG" '{msgtype:"markdown", markdown:{content:$content}}')
curl -sS -H 'Content-Type: application/json' -d "$JSON" "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WEBHOOK_KEY}"

View File

@@ -1,57 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<HTMLCodeStyleSettings>
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</HTMLCodeStyleSettings>
<JSCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="USE_DOUBLE_QUOTES" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
<option name="SPACES_WITHIN_OBJECT_TYPE_BRACES" value="false" />
</JSCodeStyleSettings>
<TypeScriptCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="USE_DOUBLE_QUOTES" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
<option name="SPACES_WITHIN_OBJECT_TYPE_BRACES" value="false" />
</TypeScriptCodeStyleSettings>
<VueCodeStyleSettings>
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
</VueCodeStyleSettings>
<codeStyleSettings language="HTML">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="TypeScript">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="Vue">
<option name="SOFT_MARGINS" value="80" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GitToolBoxBlameSettings">
<option name="version" value="2" />
</component>
</project>

View File

@@ -1,7 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="Stylelint" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>

4
.idea/shelf/___.xml generated
View File

@@ -1,4 +0,0 @@
<changelist name="在变基之前未提交的更改_[更改]" date="1727095460566" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/在变基之前未提交的更改_[更改]/shelved.patch" />
<option name="DESCRIPTION" value="在变基之前未提交的更改 [更改]" />
</changelist>

File diff suppressed because one or more lines are too long

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

187
.idea/workspace.xml generated
View File

@@ -1,187 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="7ab9fc39-b8f5-4c75-8b68-06560187de80" name="更改" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/Cart.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Cart.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/admin/add_order/add_menu/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/admin/add_order/add_menu/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/admin/order_manage/detail/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/admin/order_manage/detail/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/admin/order_manage/list/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/admin/order_manage/list/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/admin/verify/verify_list/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/admin/verify/verify_list/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/admin/withdrawal/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/admin/withdrawal/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/goods/pay/index.scss" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/goods/pay/index.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/index/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/index/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/mer/mer_detail/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/mer/mer_detail/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/users/order_list/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/users/order_list/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/users/order_list_detail/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/users/order_list_detail/index.vue" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<favorite-branches>
<branch-storage>
<map>
<entry type="REMOTE">
<value>
<list>
<branch-info repo="$PROJECT_DIR$" source="origin/dev" />
</list>
</value>
</entry>
</map>
</branch-storage>
</favorite-branches>
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="test" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GitToolBoxStore">
<option name="recentBranches">
<RecentBranches>
<option name="branchesForRepo">
<list>
<RecentBranchesForRepo>
<option name="branches">
<list>
<RecentBranch>
<option name="branchName" value="dev" />
<option name="lastUsedInstant" value="1727095515" />
</RecentBranch>
<RecentBranch>
<option name="branchName" value="test" />
<option name="lastUsedInstant" value="1727095484" />
</RecentBranch>
<RecentBranch>
<option name="branchName" value="master" />
<option name="lastUsedInstant" value="1723461333" />
</RecentBranch>
</list>
</option>
<option name="repositoryRootUrl" value="file://$PROJECT_DIR$" />
</RecentBranchesForRepo>
</list>
</option>
</RecentBranches>
</option>
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="2kR3vxmlfQDhh9CxCzSETybymrq" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;dev&quot;,
&quot;last_opened_file_path&quot;: &quot;E:/ProjectCode/jdt-user&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.stylelint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.stylelint&quot;: &quot;E:\\ProjectCode\\jdt-user\\node_modules\\stylelint&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;npm.dev:weapp.executor&quot;: &quot;Run&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;,
&quot;ts.external.directory.path&quot;: &quot;E:\\ProjectCode\\jdt-user\\node_modules\\typescript\\lib&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="RunManager">
<configuration default="true" type="ShConfigurationType">
<option name="SCRIPT_TEXT" value="" />
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
<option name="SCRIPT_PATH" value="" />
<option name="SCRIPT_OPTIONS" value="" />
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
<option name="INTERPRETER_PATH" value="powershell.exe" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="EXECUTE_IN_TERMINAL" value="true" />
<option name="EXECUTE_SCRIPT_FILE" value="true" />
<envs />
<method v="2" />
</configuration>
<configuration name="dev:weapp" type="js.build_tools.npm" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="dev:weapp" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-js-predefined-1d06a55b98c1-0b3e54e931b4-JavaScript-WS-241.19072.23" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="默认任务">
<changelist id="7ab9fc39-b8f5-4c75-8b68-06560187de80" name="更改" comment="" />
<created>1723232795882</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1723232795882</updated>
<workItem from="1723232796811" duration="178000" />
<workItem from="1723459836239" duration="1590000" />
<workItem from="1723462530324" duration="3000" />
<workItem from="1724747502747" duration="686000" />
<workItem from="1724748201013" duration="1302000" />
<workItem from="1724749524151" duration="5000" />
<workItem from="1724992450724" duration="796000" />
<workItem from="1724993259676" duration="41000" />
<workItem from="1724993306937" duration="396000" />
<workItem from="1725359530794" duration="51000" />
<workItem from="1725359589345" duration="47000" />
<workItem from="1725359641218" duration="12030000" />
<workItem from="1727095306994" duration="898000" />
<workItem from="1727096222888" duration="57000" />
<workItem from="1727096286510" duration="23000" />
<workItem from="1727149833306" duration="64000" />
<workItem from="1727150105344" duration="642000" />
<workItem from="1727154905601" duration="284000" />
<workItem from="1727155681075" duration="125000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
</component>
</project>

View File

@@ -1,3 +1,4 @@
/node_modules/** /node_modules/**
/dist/* /dist/*
/public/* /public/*
/src/static/*

View File

@@ -1,7 +1,8 @@
{ {
"arrowParens": "avoid", "arrowParens": "avoid",
"bracketSameLine": true, "bracketSameLine": true,
"bracketSpacing": false, "bracketSpacing": true,
"singleQuote": true, "singleQuote": true,
"trailingComma": "all" "trailingComma": "all",
"endOfLine": "lf"
} }

View File

@@ -1,5 +1,3 @@
// babel-preset-taro 更多选项和默认值:
// https://github.com/NervJS/taro/blob/next/packages/babel-preset-taro/README.md
module.exports = { module.exports = {
presets: [ presets: [
[ [

105
components.d.ts vendored
View File

@@ -1,57 +1,58 @@
// generated by unplugin-vue-components /* eslint-disable */
// We suggest you to commit this file into source control // @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399 // Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core'; // biome-ignore lint: disable
export {}
export {}; /* prettier-ignore */
declare module 'vue' {
declare module '@vue/runtime-core' {
export interface GlobalComponents { export interface GlobalComponents {
Auth: typeof import('./src/components/Auth.vue')['default']; Auth: typeof import('./src/components/Auth.vue')['default']
Back: typeof import('./src/components/Back.vue')['default']; Back: typeof import('./src/components/Back.vue')['default']
Cart: typeof import('./src/components/Cart.vue')['default']; Cart: typeof import('./src/components/Cart.vue')['default']
MerList: typeof import('./src/components/MerList.vue')['default']; MerList: typeof import('./src/components/MerList.vue')['default']
NutAvatar: typeof import('@nutui/nutui-taro')['Avatar']; NutAvatar: typeof import('@nutui/nutui-taro')['Avatar']
NutBacktop: typeof import('@nutui/nutui-taro')['Backtop']; NutBacktop: typeof import('@nutui/nutui-taro')['Backtop']
NutButton: typeof import('@nutui/nutui-taro')['Button']; NutButton: typeof import('@nutui/nutui-taro')['Button']
NutCalendar: typeof import('@nutui/nutui-taro')['Calendar']; NutCalendar: typeof import('@nutui/nutui-taro')['Calendar']
NutCell: typeof import('@nutui/nutui-taro')['Cell']; NutCell: typeof import('@nutui/nutui-taro')['Cell']
NutCellGroup: typeof import('@nutui/nutui-taro')['CellGroup']; NutCellGroup: typeof import('@nutui/nutui-taro')['CellGroup']
NutCheckbox: typeof import('@nutui/nutui-taro')['Checkbox']; NutCheckbox: typeof import('@nutui/nutui-taro')['Checkbox']
NutCheckboxGroup: typeof import('@nutui/nutui-taro')['CheckboxGroup']; NutCheckboxGroup: typeof import('@nutui/nutui-taro')['CheckboxGroup']
NutDialog: typeof import('@nutui/nutui-taro')['Dialog']; NutDialog: typeof import('@nutui/nutui-taro')['Dialog']
NutEllipsis: typeof import('@nutui/nutui-taro')['Ellipsis']; NutEllipsis: typeof import('@nutui/nutui-taro')['Ellipsis']
NutEmpty: typeof import('@nutui/nutui-taro')['Empty']; NutEmpty: typeof import('@nutui/nutui-taro')['Empty']
NutForm: typeof import('@nutui/nutui-taro')['Form']; NutForm: typeof import('@nutui/nutui-taro')['Form']
NutFormItem: typeof import('@nutui/nutui-taro')['FormItem']; NutFormItem: typeof import('@nutui/nutui-taro')['FormItem']
NutGrid: typeof import('@nutui/nutui-taro')['Grid']; NutGrid: typeof import('@nutui/nutui-taro')['Grid']
NutGridItem: typeof import('@nutui/nutui-taro')['GridItem']; NutGridItem: typeof import('@nutui/nutui-taro')['GridItem']
NutImagePreview: typeof import('@nutui/nutui-taro')['ImagePreview']; NutImagePreview: typeof import('@nutui/nutui-taro')['ImagePreview']
NutInput: typeof import('@nutui/nutui-taro')['Input']; NutInput: typeof import('@nutui/nutui-taro')['Input']
NutInputNumber: typeof import('@nutui/nutui-taro')['InputNumber']; NutInputNumber: typeof import('@nutui/nutui-taro')['InputNumber']
NutOverlay: typeof import('@nutui/nutui-taro')['Overlay']; NutOverlay: typeof import('@nutui/nutui-taro')['Overlay']
NutPagination: typeof import('@nutui/nutui-taro')['Pagination']; NutPagination: typeof import('@nutui/nutui-taro')['Pagination']
NutPicker: typeof import('@nutui/nutui-taro')['Picker']; NutPicker: typeof import('@nutui/nutui-taro')['Picker']
NutPopover: typeof import('@nutui/nutui-taro')['Popover']; NutPopover: typeof import('@nutui/nutui-taro')['Popover']
NutPopup: typeof import('@nutui/nutui-taro')['Popup']; NutPopup: typeof import('@nutui/nutui-taro')['Popup']
NutPrice: typeof import('@nutui/nutui-taro')['Price']; NutPrice: typeof import('@nutui/nutui-taro')['Price']
NutRadio: typeof import('@nutui/nutui-taro')['Radio']; NutRadio: typeof import('@nutui/nutui-taro')['Radio']
NutRadioGroup: typeof import('@nutui/nutui-taro')['RadioGroup']; NutRadioGroup: typeof import('@nutui/nutui-taro')['RadioGroup']
NutRate: typeof import('@nutui/nutui-taro')['Rate']; NutRate: typeof import('@nutui/nutui-taro')['Rate']
NutSwiper: typeof import('@nutui/nutui-taro')['Swiper']; NutSwiper: typeof import('@nutui/nutui-taro')['Swiper']
NutSwiperItem: typeof import('@nutui/nutui-taro')['SwiperItem']; NutSwiperItem: typeof import('@nutui/nutui-taro')['SwiperItem']
NutSwitch: typeof import('@nutui/nutui-taro')['Switch']; NutSwitch: typeof import('@nutui/nutui-taro')['Switch']
NutTable: typeof import('@nutui/nutui-taro')['Table']; NutTable: typeof import('@nutui/nutui-taro')['Table']
NutTabPane: typeof import('@nutui/nutui-taro')['TabPane']; NutTabPane: typeof import('@nutui/nutui-taro')['TabPane']
NutTabs: typeof import('@nutui/nutui-taro')['Tabs']; NutTabs: typeof import('@nutui/nutui-taro')['Tabs']
NutTextarea: typeof import('@nutui/nutui-taro')['Textarea']; NutTextarea: typeof import('@nutui/nutui-taro')['Textarea']
NutUploader: typeof import('@nutui/nutui-taro')['Uploader']; NutUploader: typeof import('@nutui/nutui-taro')['Uploader']
Pay: typeof import('./src/components/Pay.vue')['default']; Pay: typeof import('./src/components/Pay.vue')['default']
Popup: typeof import('./src/components/Popup.vue')['default']; Popup: typeof import('./src/components/Popup.vue')['default']
RichEditor: typeof import('./src/components/RichEditor.vue')['default']; RichEditor: typeof import('./src/components/RichEditor.vue')['default']
StoreList: typeof import('./src/components/StoreList.vue')['default']; StoreList: typeof import('./src/components/StoreList.vue')['default']
Ucharts: typeof import('./src/components/Ucharts.vue')['default']; Ucharts: typeof import('./src/components/Ucharts.vue')['default']
Upload: typeof import('./src/components/Upload.vue')['default']; Upload: typeof import('./src/components/Upload.vue')['default']
UserModal: typeof import('./src/components/UserModal.vue')['default']; UserModal: typeof import('./src/components/UserModal.vue')['default']
} }
} }

View File

@@ -4,7 +4,6 @@ module.exports = {
env: { env: {
NODE_ENV: '"development"', NODE_ENV: '"development"',
}, },
defineConstants: {},
mini: {}, mini: {},
h5: {}, h5: {},
}; };

View File

@@ -1,31 +1,31 @@
// @ts-nocheck
import Components from 'unplugin-vue-components/webpack'; import Components from 'unplugin-vue-components/webpack';
import NutUIResolver from '@nutui/nutui-taro/dist/resolver'; import NutUIResolver from '@nutui/nutui-taro/dist/resolver';
import {UnifiedWebpackPluginV5} from 'weapp-tailwindcss/webpack'; import { UnifiedWebpackPluginV5 } from 'weapp-tailwindcss/webpack';
import {join} from 'node:path'; import { join } from 'node:path';
import {argv} from 'yargs'; import { argv } from 'yargs';
const {robot = 1, desc} = argv;
const CIPluginOptFn = async () => { const CIPluginOptFn = async () => {
/** /**
* @typedef { import('@tarojs/plugin-mini-ci').CIOptions } CIOptions * @typedef { import('@tarojs/plugin-mini-ci').CIOptions } CIOptions
* @type {CIOptions} * @type {CIOptions}
*/ */
const parsedArgs = await argv;
return { return {
weapp: { weapp: {
appid: process.env.TARO_APP_ID, appid: process.env.TARO_APP_ID,
privateKeyPath: process.env.TARO_APP_KEY, privateKeyPath: process.env.TARO_APP_KEY,
robot, robot: parsedArgs.robot || 1,
}, },
desc, desc: parsedArgs.desc,
}; };
}; };
const config = { const config = {
projectName: 'taroApp', projectName: 'taroApp',
date: '2023-8-13', date: '2023-8-13',
designWidth(input: {file: string}) { designWidth(input: { file: string }) {
if (input?.file?.replace(/\\+/g, '/').indexOf('@nutui') > -1) { if (input?.file?.replace(/\\+/g, '/').indexOf('@nutui') > -1) {
return 375; return 375;
} }
@@ -48,13 +48,14 @@ const config = {
framework: 'vue3', framework: 'vue3',
compiler: { compiler: {
type: 'webpack5', type: 'webpack5',
prebundle: {enable: false}, prebundle: { enable: process.env.TARO_ENV === 'h5' },
}, },
cache: { cache: {
enable: false, // Webpack 持久化缓存配置建议开启。默认配置请参考https://docs.taro.zone/docs/config-detail#cache enable: false, // Webpack 持久化缓存配置建议开启。默认配置请参考https://docs.taro.zone/docs/config-detail#cache
}, },
sass: { sass: {
data: `@import "@nutui/nutui-taro/dist/styles/variables.scss";`, data: `@import "@nutui/nutui-taro/dist/styles/variables.scss";`,
silenceDeprecations: ['import'],
}, },
alias: { alias: {
'@': join(__dirname, '..', 'src'), '@': join(__dirname, '..', 'src'),
@@ -75,7 +76,7 @@ const config = {
}); });
chain.plugin('unplugin-vue-components').use( chain.plugin('unplugin-vue-components').use(
Components({ Components({
resolvers: [NutUIResolver({taro: true})], resolvers: [NutUIResolver({ taro: true })],
}), }),
); );
}, },
@@ -110,7 +111,7 @@ const config = {
webpackChain(chain) { webpackChain(chain) {
chain.plugin('unplugin-vue-components').use( chain.plugin('unplugin-vue-components').use(
Components({ Components({
resolvers: [NutUIResolver({taro: true})], resolvers: [NutUIResolver({ taro: true })],
}), }),
); );
}, },

View File

@@ -4,7 +4,6 @@ module.exports = {
env: { env: {
NODE_ENV: '"production"', NODE_ENV: '"production"',
}, },
defineConstants: {},
mini: {}, mini: {},
h5: { h5: {
/** /**

View File

@@ -1,19 +1,12 @@
{ {
"name": "jdt-user", "name": "jdt-user",
"version": "4.0.5", "version": "4.0.18",
"private": true,
"description": "",
"templateInfo": {
"name": "jdt-user",
"typescript": true,
"css": "sass"
},
"taroConfig": { "taroConfig": {
"version": "4.0.5" "version": "4.0.18"
}, },
"scripts": { "scripts": {
"build:weapp": "taro build --type weapp", "build:weapp": "taro build --type weapp",
"build:test": "taro build --type weapp --mode test", "build:test": "taro build --type weapp --mode reserve",
"build:swan": "taro build --type swan", "build:swan": "taro build --type swan",
"build:alipay": "taro build --type alipay", "build:alipay": "taro build --type alipay",
"build:tt": "taro build --type tt", "build:tt": "taro build --type tt",
@@ -23,6 +16,7 @@
"build:jd": "taro build --type jd", "build:jd": "taro build --type jd",
"build:quickapp": "taro build --type quickapp", "build:quickapp": "taro build --type quickapp",
"dev:weapp": "taro build --type weapp --watch", "dev:weapp": "taro build --type weapp --watch",
"dev:weapp:prview": "taro build --type weapp --watch --mode reserve",
"dev:swan": "npm run build:swan -- --watch", "dev:swan": "npm run build:swan -- --watch",
"dev:alipay": "npm run build:alipay -- --watch", "dev:alipay": "npm run build:alipay -- --watch",
"dev:tt": "npm run build:tt -- --watch", "dev:tt": "npm run build:tt -- --watch",
@@ -35,11 +29,10 @@
"lint:fix": "eslint --fix --ext .ts,.vue .", "lint:fix": "eslint --fix --ext .ts,.vue .",
"lint:staged": "lint-staged", "lint:staged": "lint-staged",
"prepare": "husky install", "prepare": "husky install",
"preview": "vite preview",
"cz": "cz", "cz": "cz",
"lf": "npx prettier --write --end-of-line lf .",
"postinstall": "weapp-tw patch", "postinstall": "weapp-tw patch",
"build:weapp:prod:upload": "taro build --type weapp --upload --robot=1 --desc='正式环境'", "build:weapp:prod:upload": "taro build --type weapp --upload --robot=1 --desc='正式环境'",
"build:weapp:reserve:upload": "taro build --type weapp --upload --robot=3 --desc='备用环境' --mode reserve",
"build:weapp:test:upload": "taro build --type weapp --upload --robot=2 --desc='测试环境' --mode test" "build:weapp:test:upload": "taro build --type weapp --upload --robot=2 --desc='测试环境' --mode test"
}, },
"browserslist": [ "browserslist": [
@@ -47,11 +40,10 @@
"Android >= 4.1", "Android >= 4.1",
"ios >= 8" "ios >= 8"
], ],
"author": "", "author": "JDT",
"lint-staged": { "lint-staged": {
"*.{ts,vue}": [ "*.{ts,vue}": [
"eslint --ext .ts,.vue .", "eslint --ext .ts,.vue ."
"npx prettier --write --end-of-line lf ."
] ]
}, },
"config": { "config": {
@@ -60,66 +52,68 @@
} }
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.23.5", "@babel/runtime": "^7.28.4",
"@nutui/icons-vue-taro": "^0.0.9", "@nutui/icons-vue-taro": "^0.0.9",
"@nutui/nutui-taro": "^4.3.13", "@nutui/nutui-taro": "^4.3.14",
"@qiun/vue-ucharts": "2.5.0-20230101", "@qiun/vue-ucharts": "2.5.0-20230101",
"@tarojs/components": "3.6.34", "@tarojs/components": "4.1.6",
"@tarojs/helper": "3.6.34", "@tarojs/helper": "4.1.6",
"@tarojs/plugin-framework-vue3": "3.6.34", "@tarojs/plugin-framework-vue3": "4.1.6",
"@tarojs/plugin-html": "3.6.34", "@tarojs/plugin-html": "4.1.6",
"@tarojs/plugin-platform-alipay": "3.6.34", "@tarojs/plugin-platform-alipay": "4.1.6",
"@tarojs/plugin-platform-h5": "3.6.34", "@tarojs/plugin-platform-h5": "4.1.6",
"@tarojs/plugin-platform-jd": "3.6.34", "@tarojs/plugin-platform-jd": "4.1.6",
"@tarojs/plugin-platform-qq": "3.6.34", "@tarojs/plugin-platform-qq": "4.1.6",
"@tarojs/plugin-platform-swan": "3.6.34", "@tarojs/plugin-platform-swan": "4.1.6",
"@tarojs/plugin-platform-tt": "3.6.34", "@tarojs/plugin-platform-tt": "4.1.6",
"@tarojs/plugin-platform-weapp": "3.6.34", "@tarojs/plugin-platform-weapp": "4.1.6",
"@tarojs/runtime": "3.6.34", "@tarojs/runtime": "4.1.6",
"@tarojs/shared": "3.6.34", "@tarojs/shared": "4.1.6",
"@tarojs/taro": "3.6.34", "@tarojs/taro": "4.1.6",
"dayjs": "^1.11.10", "dayjs": "^1.11.18",
"pinia": "^2.1.7", "pinia": "^2.3.1",
"uqrcodejs": "^4.0.7", "uqrcodejs": "^4.0.7",
"vue": "^3.3.9" "vue": "^3.5.21"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.23.5", "@babel/core": "^7.28.4",
"@commitlint/cli": "^18.4.3", "@commitlint/cli": "^18.6.1",
"@commitlint/config-conventional": "^18.4.3", "@commitlint/config-conventional": "^18.6.3",
"@tarojs/cli": "3.6.34", "@tarojs/cli": "4.1.6",
"@tarojs/plugin-mini-ci": "3.6.34", "@tarojs/plugin-mini-ci": "4.1.6",
"@tarojs/taro-loader": "3.6.34", "@tarojs/taro-loader": "4.1.6",
"@tarojs/webpack5-runner": "3.6.34", "@tarojs/webpack5-runner": "4.1.6",
"@types/node": "^18.19.1", "@types/node": "^18.19.124",
"@types/webpack-env": "^1.18.4", "@types/webpack-env": "^1.18.8",
"@typescript-eslint/eslint-plugin": "^6.13.1", "@types/yargs": "^17.0.33",
"@typescript-eslint/parser": "^6.13.1", "@typescript-eslint/eslint-plugin": "^6.21.0",
"@unocss/webpack": "^0.60.0", "@typescript-eslint/parser": "^6.21.0",
"@vue/babel-plugin-jsx": "^1.1.5", "@unocss/webpack": "^0.60.4",
"@vue/compiler-sfc": "^3.3.9", "@vue/babel-plugin-jsx": "^1.5.0",
"autoprefixer": "^10.4.19", "@vue/compiler-sfc": "^3.5.21",
"babel-preset-taro": "3.6.34", "autoprefixer": "^10.4.21",
"commitizen": "^4.3.0", "babel-preset-taro": "4.1.6",
"commitizen": "^4.3.1",
"css-loader": "3.4.2", "css-loader": "3.4.2",
"cz-customizable": "^7.0.0", "cz-customizable": "^7.5.1",
"eslint": "^8.55.0", "eslint": "^8.57.1",
"eslint-config-taro": "3.6.34", "eslint-config-taro": "4.1.6",
"eslint-plugin-vue": "^9.19.2", "eslint-plugin-vue": "^9.33.0",
"husky": "^8.0.3", "husky": "^8.0.3",
"lint-staged": "^15.1.0", "lint-staged": "^15.5.2",
"miniprogram-ci": "^2.0.8", "miniprogram-ci": "^2.1.26",
"postcss": "8.4.29", "postcss": "8.4.29",
"postcss-rem-to-responsive-pixel": "^6.0.1", "postcss-rem-to-responsive-pixel": "^6.1.0",
"prettier": "^3.6.2",
"style-loader": "1.3.0", "style-loader": "1.3.0",
"stylelint": "9.3.0", "stylelint": "9.3.0",
"tailwindcss": "^3.4.3", "tailwindcss": "^3.4.17",
"ts-node": "^10.9.1", "ts-node": "^10.9.2",
"typescript": "^4.9.5", "typescript": "^5.9.2",
"unplugin-vue-components": "^0.23.0", "unplugin-vue-components": "^28.8.0",
"vue-loader": "^17.3.1", "vue-loader": "^17.4.2",
"weapp-tailwindcss": "^3.2.0", "weapp-tailwindcss": "^3.7.0",
"webpack": "^5.89.0" "webpack": "^5.101.3",
}, "yargs": "^17.7.2"
"packageManager": "pnpm@9.1.4+sha512.9df9cf27c91715646c7d675d1c9c8e41f6fce88246f1318c1aa6a1ed1aeb3c4f032fcdf4ba63cc69c4fe6d634279176b5358727d8f2cc1e65b65f43ce2f8bfb0" }
} }

13
pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,13 @@
onlyBuiltDependencies:
- '@parcel/watcher'
- '@swc/core'
- '@tarojs/binding'
- '@tarojs/cli'
- core-js
- core-js-pure
- esbuild
- less
- protobufjs
- swiper
- vue-demi
- weapp-tailwindcss

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAmHk5BywZ6y2rji/dL2HooKGiTuHrcSeGFODvDK6PPUjnieWB
ev7C6N9kBWNbtYiwyLVpW5iKCxCb/GaBa5EIE0nXnKiOhThP3a8OYDW0oA9Xyp03
1W56U3tnHA/GziyABIIMxqA45WYh3e9ar/sdhDvDyre0yl+8cWcPdNOVOW7as88W
yXDsCQbQedPIAy3sRANZ6K2QTNe5Aht3Y7F1uMKRlJwLodutUopPd32rxJz7WNhB
j9CrjzgnfLJa7siURM2r6om2osNFqHP4bmy5yO68TPI8JQgJTUqoNswgFDa2ng9Y
lOhks6kMR8ldL89+fYqILGDVG7124LKIo1awTQIDAQABAoIBACS+Kaj5zrEmy02z
aRjO/lEfQk7CEIuvG5eScOjcc/YvyGQpo18xX2Tg2GiX/fSsIPXtCZuiEboC4aQc
S5nRVGHZjJTa5aVi4ZQpaEx1BLcBm4VfB6JuQho2Ba30e1MZ1CvB7zQ6Thux1f12
faMk34MLJ+6FAJM4KOAnFslvZ2l0VxIlBq5pbF71dO/MsIrpBWVFNGqu6jtXRUJw
J92PbaFMi/smsgdXixsokzPmE5em3zLdp5cfHQCRBjNBclMjlnHhwQVK8wU7D609
CPcvPS8J3PMceMeGXC1QXFANllVecmn7jECVBU5H4Ed0pb89T9Q7yWVnVBo31ZB7
r4GuL+ECgYEAyLcE4cuPsp31oaKATSZrBmypQuGFsarddyereN8ATZ9DjbFL9Y2/
NazLmG1KjeD1yN1q9/ek+nctKTNzuY14cVeahDoiv0ALNUOuS7IFzoHWf5SnNKEx
oEgGJV9D6olk9YnPF5iwn/lRL84af3dxSnKr75hh8Yv5hWrPnJ95xJkCgYEAwniQ
z6yFg2SmnzwwYV72/aoukmsI3KKBHMEDkAFOummy7iv8eT+9DLumQ9BC+mT3eFmq
GVNVM+199NTQ5b5CzXYalSsw93rewhRkk0RVV31AJUwaRbYy6F6O502SpFYb4n8f
S7KfDv70utGOnycMBNjeaFGWxAZbUCLjfUv8JdUCgYBb1fGz5lHPZhrXY+TUZ/mc
LOedJFbpncZLGKmKWm5nFbHxCOg6aCrOwks9aPQtynpq93RUFMk1mIXfTh1rDuHG
6lBWo8r2OrVmH5uGIuQpQpsEMN34ZLCyJ4I4Y0hN7aN1/SH2J/TYnViaSPEy1VHO
wH0O2Wgm/uaiNubbQNSUMQKBgCXT5fc/i8j/LxoSTybhnhHBpMV+ZH7mbU72jIba
ekHwhYmmrLm5GED9z12piR3Dvg9/AYNjnlM3gyS4sNm/pKbqrkkN2byJ/gKqjNXI
mQEnr+6RWxrsUgK5QfrkL/4fcdUg/SlwWVhFZ71fPerfYYsf1ENee4Et610vLCkX
OrjxAoGATIlZgaPuDA/Sh/YTxxSEjNZGCWx4YvWZfL+PW2ItuadMeD2lLai6lOOi
9ew2xXZkvaeA9PGOA5YK2121M5brwkB0Kc3zNvEmrkpQDJYqeoRvLEuFGDmZ/MX1
p0bzKs1vvh5dyFjWQ5IN9FckZ3Fpk6A1zMEuyQdk35TwX+w5EdE=
-----END RSA PRIVATE KEY-----

View File

@@ -1,5 +1,5 @@
{ {
"miniprogramRoot": "./dist", "miniprogramRoot": "dist/",
"projectname": "捷兑通", "projectname": "捷兑通",
"description": "", "description": "",
"setting": { "setting": {
@@ -8,7 +8,24 @@
"enhance": true, "enhance": true,
"compileHotReLoad": false, "compileHotReLoad": false,
"postcss": true, "postcss": true,
"minified": true "minified": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
}
}, },
"compileType": "miniprogram" "compileType": "miniprogram",
"appid": "wx7b3322daa2cf9c88",
"libVersion": "3.7.11",
"srcMiniprogramRoot": "dist/",
"packOptions": {
"ignore": [],
"include": []
},
"condition": {},
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
}
} }

View File

@@ -0,0 +1,7 @@
{
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"projectname": "%E6%8D%B7%E5%85%91%E9%80%9A",
"setting": {
"compileHotReLoad": false
}
}

4
src/api/game.ts Normal file
View File

@@ -0,0 +1,4 @@
import request from '../utils/request';
// 获取游戏列表
export const getGameList = () => request('/game', {}, 'POST');

View File

@@ -6,7 +6,6 @@ export default defineAppConfig({
'pages/user/index', 'pages/user/index',
'pages/allClassList/index', 'pages/allClassList/index',
'pages/game/gamedetail/index', 'pages/game/gamedetail/index',
'pages/game/gameview/index',
'pages/game/view/index', 'pages/game/view/index',
'pages/fastBuy/index', 'pages/fastBuy/index',
], ],
@@ -98,12 +97,12 @@ export default defineAppConfig({
selectedIconPath: 'static/tabbar/1-1.png', selectedIconPath: 'static/tabbar/1-1.png',
text: '首页', text: '首页',
}, },
{ // {
pagePath: 'pages/game/gamehome/index', // pagePath: 'pages/game/gamehome/index',
iconPath: 'static/tabbar/2-0.png', // iconPath: 'static/tabbar/2-0.png',
selectedIconPath: 'static/tabbar/2-1.png', // selectedIconPath: 'static/tabbar/2-1.png',
text: '游戏', // text: '游戏',
}, // },
{ {
pagePath: 'pages/cart/index', pagePath: 'pages/cart/index',
iconPath: 'static/tabbar/3-0.png', iconPath: 'static/tabbar/3-0.png',

View File

@@ -5,8 +5,6 @@
page { page {
background-color: #f5f5f5; background-color: #f5f5f5;
// font-size: 30rpx;
// IOS安全区域
padding-bottom: constant(safe-area-inset-bottom); padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom);
} }

View File

@@ -1,4 +1,4 @@
import {createApp} from 'vue'; import { createApp } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import './app.scss'; import './app.scss';

View File

@@ -16,7 +16,7 @@
<script setup lang="ts"> <script setup lang="ts">
// import { computed, ref } from "vue"; // import { computed, ref } from "vue";
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {login} from '@/api/user'; import { login } from '@/api/user';
defineProps({ defineProps({
visible: { visible: {
@@ -40,9 +40,9 @@ const onOk = () => {
desc: '完善用户资料', desc: '完善用户资料',
success: async user => { success: async user => {
Taro.login({ Taro.login({
success: async ({code}) => { success: async ({ code }) => {
try { try {
const {data}: any = await login({ const { data }: any = await login({
code: code, code: code,
nickName: user.userInfo.nickName, nickName: user.userInfo.nickName,
avatarUrl: user.userInfo.avatarUrl, avatarUrl: user.userInfo.avatarUrl,

View File

@@ -1,5 +1,5 @@
<template> <template>
<view class="head-wrapper" :style="{top: BarHeight + 'px'}"> <view class="head-wrapper" :style="{ top: BarHeight + 'px' }">
<view class="head-menu"> <view class="head-menu">
<Left class="iconfont" @click="returns" /> <Left class="iconfont" @click="returns" />
<view class="line"></view> <view class="line"></view>
@@ -11,8 +11,8 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {computed} from 'vue'; import { computed } from 'vue';
import {Home, Left} from '@nutui/icons-vue-taro'; import { Home, Left } from '@nutui/icons-vue-taro';
const statusBarHeight = Taro.getSystemInfoSync()?.statusBarHeight as number; const statusBarHeight = Taro.getSystemInfoSync()?.statusBarHeight as number;
const BarHeight = computed(() => statusBarHeight - 7); const BarHeight = computed(() => statusBarHeight - 7);

View File

@@ -1,10 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {addCart, getCart, clearCart} from '@/api/cart'; import { addCart, getCart, clearCart } from '@/api/cart';
import {Plus, Minus} from '@nutui/icons-vue-taro'; import { Plus, Minus } from '@nutui/icons-vue-taro';
import {createActiveOrder} from '@/api/goods'; import { createActiveOrder } from '@/api/goods';
import {createAfterOrder, getUserPoint} from '@/api/admin'; import { createAfterOrder, getUserPoint } from '@/api/admin';
import Pay from '@/components/Pay.vue'; import Pay from '@/components/Pay.vue';
interface CardList { interface CardList {
@@ -202,7 +202,7 @@ defineExpose({
<!-- <view>购物车数量: {{ cartInfo.count }}</view> --> <!-- <view>购物车数量: {{ cartInfo.count }}</view> -->
<view class="cardImg"> <view class="cardImg">
<image <image
src="http://p1.meituan.net/csc/929f447a96a44b09a09b2e0055433222717.png"> src="https://p1.meituan.net/csc/929f447a96a44b09a09b2e0055433222717.png">
</image> </image>
<view class="count-text" v-if="cartInfo.count > 0"> <view class="count-text" v-if="cartInfo.count > 0">
<text>{{ cartInfo.count }}</text> <text>{{ cartInfo.count }}</text>
@@ -221,7 +221,7 @@ defineExpose({
</view> </view>
<!-- 购物车弹窗 --> <!-- 购物车弹窗 -->
<nut-popup <nut-popup
:style="{padding: '15px'}" :style="{ padding: '15px' }"
round round
position="bottom" position="bottom"
z-index="1" z-index="1"
@@ -233,7 +233,7 @@ defineExpose({
<!-- <Del2 color="#666666" /> --> <!-- <Del2 color="#666666" /> -->
<image <image
class="w-[20px] h-[20px]" class="w-[20px] h-[20px]"
src="http://p0.meituan.net/csc/db4d11fd744b69435c6ffdc6bfc868c5684.png" /> src="https://p0.meituan.net/csc/db4d11fd744b69435c6ffdc6bfc868c5684.png" />
<text class="text-[20px]" style="color: #666666">清空购物车</text> <text class="text-[20px]" style="color: #666666">清空购物车</text>
</view> </view>
</view> </view>
@@ -316,7 +316,7 @@ $h-border-radius: 50px;
position: absolute; position: absolute;
top: -10px; top: -10px;
right: -10px; right: -10px;
background-image: url('http://p0.meituan.net/csc/80b0e11d4270d09324df0b802d4c479b986.png'); background-image: url('https://p0.meituan.net/csc/80b0e11d4270d09324df0b802d4c479b986.png');
background-size: 100% 100%; background-size: 100% 100%;
// padding: 0 8px; // padding: 0 8px;
width: 35px; width: 35px;

View File

@@ -2,6 +2,7 @@
<view class="list-box"> <view class="list-box">
<view class="list"> <view class="list">
<swiper <swiper
v-if="bannerList.length !== 0"
class="item" class="item"
:style="{ :style="{
height: '250px', height: '250px',
@@ -82,13 +83,13 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {calculateDistance, parseQueryString} from '@/utils'; import { calculateDistance, parseQueryString } from '@/utils';
import {bindParent, getBanner} from '@/api/user'; import { bindParent, getBanner } from '@/api/user';
import {getMerList} from '@/api/goods'; import { getMerList } from '@/api/goods';
const classId = defineModel({default: 0}); const classId = defineModel({ default: 0 });
const list1 = ref<Array<MerData>>([]); const list1 = ref<Array<MerData>>([]);
const list2 = ref<Array<MerData>>([]); const list2 = ref<Array<MerData>>([]);
@@ -166,8 +167,8 @@ const get_mer_list = async () => {
const bannerList = ref<any[]>([]); const bannerList = ref<any[]>([]);
const get_banner_list = async () => { const get_banner_list = async () => {
const {data}: any = await getBanner(); const { data }: any = await getBanner();
bannerList.value = data.data; bannerList.value = data.data || [];
}; };
const toPage = async (url: string) => { const toPage = async (url: string) => {
@@ -175,7 +176,7 @@ const toPage = async (url: string) => {
// url转对象 // url转对象
const obj = parseQueryString(url); const obj = parseQueryString(url);
if (obj.type === '1') { if (obj.type === '1') {
const {data: res} = await getMerList({}); const { data: res } = await getMerList({});
const mer = res.data.filter(item => item.bid === obj.bid)[0]; const mer = res.data.filter(item => item.bid === obj.bid)[0];
Taro.setStorageSync('mer_info', mer); Taro.setStorageSync('mer_info', mer);
} }

View File

@@ -5,13 +5,13 @@
round round
safe-area-inset-bottom safe-area-inset-bottom
:close-on-click-overlay="false" :close-on-click-overlay="false"
:style="{height: 'auto'}" :style="{ height: 'auto' }"
:visible="isShowPay" :visible="isShowPay"
@click-close-icon="closePay"> @click-close-icon="closePay">
<view class="div"> <view class="div">
<view style="text-align: center">支付方式</view> <view style="text-align: center">支付方式</view>
<nut-cell-group <nut-cell-group
:style="{margin: interval ? '40rpx 0 150rpx 0' : '40rpx 0'}"> :style="{ margin: interval ? '40rpx 0 150rpx 0' : '40rpx 0' }">
<nut-cell <nut-cell
title="微信支付" title="微信支付"
desc="使用微信快捷支付" desc="使用微信快捷支付"
@@ -31,7 +31,7 @@
</template> </template>
</nut-cell> </nut-cell>
<nut-cell <nut-cell
title="天才小猪积分支付" title="智多鑫积分支付"
:desc="`剩余积分:${jfInfo.jh_info?.integral || 0}`" :desc="`剩余积分:${jfInfo.jh_info?.integral || 0}`"
is-link is-link
@click="goPay(3)"> @click="goPay(3)">
@@ -45,11 +45,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref, watch} from 'vue'; import { ref, watch } from 'vue';
import {IconFont} from '@nutui/icons-vue-taro'; import { IconFont } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {payOrder} from '@/api/order'; import { payOrder } from '@/api/order';
import {getPersonalInfo} from '@/api/user'; import { getPersonalInfo } from '@/api/user';
const prop = defineProps({ const prop = defineProps({
interval: { interval: {
@@ -75,7 +75,7 @@ const prop = defineProps({
const emit = defineEmits(['closePay', 'successPay']); const emit = defineEmits(['closePay', 'successPay']);
const info = ref<{integral?: any}>({}); const info = ref<{ integral?: any }>({});
watch( watch(
() => prop.isShowPay, () => prop.isShowPay,
@@ -106,7 +106,7 @@ const goPay = async (type: number) => {
try { try {
console.log(prop.jfInfo); console.log(prop.jfInfo);
// 1微信支付 2积分支付 3专属积分兑换 // 1微信支付 2积分支付 3专属积分兑换
const {data} = await payOrder({ const { data } = await payOrder({
oid: prop.jfInfo.oid, oid: prop.jfInfo.oid,
OrderType: prop.OrderType, OrderType: prop.OrderType,
PayType: type, PayType: type,

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
const isShow = ref(false); const isShow = ref(false);

View File

@@ -108,11 +108,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {reactive} from 'vue'; import { reactive } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {BASE_URL} from '@/utils/request'; import { BASE_URL } from '@/utils/request';
const {content} = defineProps<{ const { content } = defineProps<{
content: string; content: string;
}>(); }>();
@@ -143,7 +143,7 @@ function onEditorReady() {
} }
// 失去焦点时,获取富文本的内容 // 失去焦点时,获取富文本的内容
function getCtx(e: {detail: {html: any}}) { function getCtx(e: { detail: { html: any } }) {
data.richText = e.detail.html; data.richText = e.detail.html;
emits('input', e.detail.html); emits('input', e.detail.html);
} }
@@ -159,15 +159,15 @@ function redo() {
} }
//修改样式 //修改样式
function format(e: {target: {dataset: {name: any; value: any}}}) { function format(e: { target: { dataset: { name: any; value: any } } }) {
// console.log("format", e.target.dataset); // console.log("format", e.target.dataset);
let {name, value} = e.target.dataset; let { name, value } = e.target.dataset;
if (!name) return; if (!name) return;
data.editorCtx.format(name, value); data.editorCtx.format(name, value);
} }
//通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式 //通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式
function onStatusChange(e: {detail: any}) { function onStatusChange(e: { detail: any }) {
data.formats = e.detail; data.formats = e.detail;
} }
@@ -187,7 +187,7 @@ function insertImage() {
Taro.uploadFile({ Taro.uploadFile({
url: `${BASE_URL}/upload`, url: `${BASE_URL}/upload`,
name: 'file', name: 'file',
header: {token: Taro.getStorageSync('token')}, header: { token: Taro.getStorageSync('token') },
filePath: res.tempFilePaths[0], filePath: res.tempFilePaths[0],
success: res => { success: res => {
console.log(res); console.log(res);

View File

@@ -1,6 +1,6 @@
<template> <template>
<view> <view>
<view class="flex justify-center" v-if="storeList.length > 0"> <view v-if="storeList.length > 0">
<view <view
class="bg-white rounded-[15px] mt-3 p-2 w-[95%] flex items-center" class="bg-white rounded-[15px] mt-3 p-2 w-[95%] flex items-center"
v-for="(item, index) in storeList" v-for="(item, index) in storeList"
@@ -15,6 +15,7 @@
}}</view> }}</view>
<nut-rate <nut-rate
spacing="1" spacing="1"
disabled
active-color="rgba(252, 207, 10, 1)" active-color="rgba(252, 207, 10, 1)"
v-model="item.rate" /> v-model="item.rate" />
<view class="text-[#9E9E9E] text-[25px]">销量10000</view> <view class="text-[#9E9E9E] text-[25px]">销量10000</view>
@@ -30,9 +31,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {getStoreList} from '@/api/home'; import { getStoreList } from '@/api/home';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {ref} from 'vue'; import { ref } from 'vue';
const name = defineModel({ const name = defineModel({
default: '', default: '',
}); });
@@ -51,9 +52,10 @@ const getList = async () => {
}; };
const goDetail = item => { const goDetail = item => {
console.log(item);
Taro.setStorageSync('mer_info', item); Taro.setStorageSync('mer_info', item);
Taro.navigateTo({ Taro.navigateTo({
url: `/pages/mer/mer_detail/index`, url: `/pages/mer/mer_detail/index?bid=${item.bid}`,
}); });
}; };
</script> </script>

View File

@@ -11,8 +11,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {BASE_URL} from '@/utils/request'; import { BASE_URL } from '@/utils/request';
import {computed, ref} from 'vue'; import { computed, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
const props = defineProps({ const props = defineProps({

View File

@@ -1,10 +1,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import {computed, ref} from 'vue'; import { computed, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import headImg from '../static/def_avatar.png'; import headImg from '../static/def_avatar.png';
import logoImg from '../static/logo.jpg'; import logoImg from '../static/logo.jpg';
import {BASE_URL} from '@/utils/request'; import { BASE_URL } from '@/utils/request';
import {getPhone, login} from '@/api/user'; import { getPhone, login } from '@/api/user';
const props = defineProps({ const props = defineProps({
isShow: { isShow: {
@@ -36,7 +36,7 @@ const closeAttr = () => {
}; };
const onChooseAvatar = e => { const onChooseAvatar = e => {
const {avatarUrl} = e.detail; const { avatarUrl } = e.detail;
Taro.uploadFile({ Taro.uploadFile({
url: `${BASE_URL}/upload`, url: `${BASE_URL}/upload`,
filePath: avatarUrl, filePath: avatarUrl,
@@ -57,7 +57,7 @@ const getPhoneNumber = async (e: any) => {
title: '授权手机号中', title: '授权手机号中',
mask: true, mask: true,
}); });
const {code} = e.detail; const { code } = e.detail;
const res = await getPhone({ const res = await getPhone({
code: code, code: code,
}); });
@@ -112,7 +112,7 @@ const formSubmit = async (e: any) => {
position="bottom" position="bottom"
safe-area-inset-bottom safe-area-inset-bottom
closeable closeable
:style="{padding: '20px 10px'}" :style="{ padding: '20px 10px' }"
v-model:visible="show" v-model:visible="show"
@close="closeAttr" @close="closeAttr"
:close-on-click-overlay="false"> :close-on-click-overlay="false">

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html> <!doctype html>
<html> <html>
<head> <head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />

View File

@@ -62,11 +62,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {Ref, ref} from 'vue'; import { Ref, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import Cart from '../../../../components/Cart.vue'; import Cart from '../../../../components/Cart.vue';
import {Cart2} from '@nutui/icons-vue-taro'; import { Cart2 } from '@nutui/icons-vue-taro';
import {getGoodList, getMerCategory} from '../../../../api/goods'; import { getGoodList, getMerCategory } from '../../../../api/goods';
interface goodList { interface goodList {
ID: number; ID: number;

View File

@@ -51,10 +51,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import BackComponent from '../../../../components/Back.vue'; import BackComponent from '../../../../components/Back.vue';
import {checkPhone} from '../../../../api/admin'; import { checkPhone } from '../../../../api/admin';
const formVal = ref({ const formVal = ref({
seat: '', seat: '',
@@ -64,7 +64,7 @@ const formVal = ref({
const visible = ref(false); const visible = ref(false);
const formSubmit = async ({detail}: any) => { const formSubmit = async ({ detail }: any) => {
if (!detail.value.seat) if (!detail.value.seat)
return Taro.showToast({ return Taro.showToast({
title: '请填写台号', title: '请填写台号',
@@ -80,7 +80,7 @@ const formSubmit = async ({detail}: any) => {
icon: 'none', icon: 'none',
}); });
try { try {
await checkPhone({phone: detail.value.phone}); await checkPhone({ phone: detail.value.phone });
const user_info = await Taro.getStorageSync('userInfo'); const user_info = await Taro.getStorageSync('userInfo');
Taro.navigateTo({ Taro.navigateTo({
url: `/pages/admin/add_order/add_menu/index?type=1&bid=${user_info.data.bid}&seat=${formVal.value.seat}&phone=${formVal.value.phone}&notes=${formVal.value.notes}`, url: `/pages/admin/add_order/add_menu/index?type=1&bid=${user_info.data.bid}&seat=${formVal.value.seat}&phone=${formVal.value.phone}&notes=${formVal.value.notes}`,

View File

@@ -3,7 +3,8 @@
justify-content: center; justify-content: center;
box-sizing: border-box; box-sizing: border-box;
height: 100vh; height: 100vh;
background-image: url('./static/WechatIMG10.jpg'); // background-image: url('./static/WechatIMG10.jpg');
background-image: url('https://m.360buyimg.com/i/jfs/t1/288333/5/8622/43050/682e2e18Ff3a6e2af/bbc66c081c18a467.png');
background-size: 100% 35%; background-size: 100% 35%;
background-repeat: no-repeat; background-repeat: no-repeat;

View File

@@ -78,8 +78,12 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref} from 'vue'; import { onMounted, ref } from 'vue';
import {cancelAfterOrder, confirmAfterOrder, editAfterOrder} from '@/api/admin'; import {
cancelAfterOrder,
confirmAfterOrder,
editAfterOrder,
} from '@/api/admin';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
const props = defineProps({ const props = defineProps({

View File

@@ -15,7 +15,7 @@
<view v-if="listData.length > 0"> <view v-if="listData.length > 0">
<view <view
class="card" class="card"
v-for="(item, index) in (listData as any[])" v-for="(item, index) in listData as any[]"
:key="index"> :key="index">
<view class="header"> <view class="header">
<view> <view>
@@ -66,10 +66,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import Footer from './components/Footer.vue'; import Footer from './components/Footer.vue';
import {getAfterOrderList} from '@/api/admin'; import { getAfterOrderList } from '@/api/admin';
const tabsIndex = ref(0); const tabsIndex = ref(0);
@@ -108,7 +108,7 @@ const get_list = async () => {
title: '加载中', title: '加载中',
}); });
const user_info = await Taro.getStorageSync('userInfo'); const user_info = await Taro.getStorageSync('userInfo');
const {data: res} = await getAfterOrderList({ const { data: res } = await getAfterOrderList({
bid: user_info.data.bid, bid: user_info.data.bid,
status: tabsIndex.value, status: tabsIndex.value,
}); });

View File

@@ -57,9 +57,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getAfterOrder, createPayQr} from '@/api/admin'; import { getAfterOrder, createPayQr } from '@/api/admin';
const data = ref<any>({}); const data = ref<any>({});
@@ -71,11 +71,11 @@ Taro.useLoad((e: any) => {
get_data(e); get_data(e);
}); });
const get_data = async ({bid, oid}) => { const get_data = async ({ bid, oid }) => {
Taro.showLoading({ Taro.showLoading({
title: '加载中', title: '加载中',
}); });
const res = await getAfterOrder({bid, oid}); const res = await getAfterOrder({ bid, oid });
data.value = res.data.data; data.value = res.data.data;
Taro.hideLoading(); Taro.hideLoading();
}; };

View File

@@ -79,10 +79,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import Footer from '../components/Footer.vue'; import Footer from '../components/Footer.vue';
import {getAfterOrder} from '@/api/admin'; import { getAfterOrder } from '@/api/admin';
// import BackComponent from "../../../../../components/Back.vue"; // import BackComponent from "../../../../../components/Back.vue";
const data = ref<any>({}); const data = ref<any>({});

View File

@@ -11,9 +11,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onUnmounted, ref} from 'vue'; import { onUnmounted, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getAfterOrder} from '@/api/admin'; import { getAfterOrder } from '@/api/admin';
const time_id = ref(); const time_id = ref();
@@ -25,7 +25,7 @@ Taro.useLoad(e => {
info.value = e; info.value = e;
dataUrl.value = Taro.getStorageSync('pay_code'); dataUrl.value = Taro.getStorageSync('pay_code');
time_id.value = setInterval(async () => { time_id.value = setInterval(async () => {
const {data} = await getAfterOrder({ const { data } = await getAfterOrder({
bid: info.value.bid, bid: info.value.bid,
oid: info.value.oid, oid: info.value.oid,
}); });

View File

@@ -48,10 +48,10 @@
info.status === 0 info.status === 0
? '待付款' ? '待付款'
: info.status === 1 : info.status === 1
? '待使用' ? '待使用'
: info.status === 2 : info.status === 2
? '已使用' ? '已使用'
: '已失效' : '已失效'
"> ">
</nut-cell> </nut-cell>
<nut-cell title="下单用户:" :desc="info.User?.nickName"></nut-cell> <nut-cell title="下单用户:" :desc="info.User?.nickName"></nut-cell>
@@ -75,7 +75,7 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {ref} from 'vue'; import { ref } from 'vue';
const info = ref<any>({}); const info = ref<any>({});

View File

@@ -63,3 +63,44 @@
} }
} }
} }
.pull-down {
margin: 20px auto;
.TriangleDownBox {
transform: rotate(180deg);
transition: all 0.5s;
}
.TriangleUpBox {
transform: rotate(0deg);
transition: all 0.5s;
}
.menu {
.active {
border-radius: 10px;
background-color: #de1414;
padding: 10px 20px;
color: #fff;
}
.noActive {
border-radius: 10px;
padding: 10px 20px;
color: #000;
background-color: #fff;
}
}
.MenuDownBox {
margin-top: 5px;
height: 0px;
transition: height 0.5s ease;
overflow: hidden;
}
.MenuUpBox {
margin-top: 5px;
height: 80px;
transition: height 0.5s ease;
overflow: hidden;
}
}

View File

@@ -25,6 +25,27 @@
</view> </view>
</view> </view>
</view> </view>
<view class="pull-down Card" style="background: none; padding: 0">
<view
class="mr-[5px] flex items-center justify-left"
@click="IsTriangleDown = !IsTriangleDown"
><text>数据筛选</text>
<TriangleDown
style="width: auto"
:class="[!IsTriangleDown ? 'TriangleDownBox' : 'TriangleUpBox']" />
</view>
<view
class="flex menu justify-between text-[28px]"
:class="[!IsTriangleDown ? 'MenuDownBox' : 'MenuUpBox']">
<view
v-for="(item, index) in menus"
:key="index"
:class="[menuIndex === index ? 'active' : 'noActive']"
@click="tabChange(index)"
>{{ item.text }}</view
>
</view>
</view>
<view class="Card"> <view class="Card">
<view class="top" <view class="top"
><text class="iconfont icon-shujutongji icon"></text ><text class="iconfont icon-shujutongji icon"></text
@@ -95,9 +116,10 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {h, ref} from 'vue'; import { h, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {orderStatistics} from '../../../api/admin'; import { TriangleDown } from '@nutui/icons-vue-taro';
import { orderStatistics } from '../../../api/admin';
Taro.useLoad(() => { Taro.useLoad(() => {
getData(); getData();
@@ -105,6 +127,30 @@ Taro.useLoad(() => {
const orderInfo = ref<any>({}); const orderInfo = ref<any>({});
const IsTriangleDown = ref(false);
const menuIndex = ref(0);
const menus = ref([
{
text: '微信支付',
value: 1,
},
{
text: '平台积分',
value: 2,
},
{
text: '小猪积分',
value: 3,
},
]);
const tabChange = (value: number) => {
menuIndex.value = value;
getData();
};
const columns = ref([ const columns = ref([
{ {
title: '日期', title: '日期',
@@ -138,6 +184,7 @@ const getData = async () => {
const user_info = Taro.getStorageSync('userInfo'); const user_info = Taro.getStorageSync('userInfo');
const res = await orderStatistics({ const res = await orderStatistics({
bid: user_info.data.bid, bid: user_info.data.bid,
pay_type: menus.value[menuIndex.value].value,
}); });
orderInfo.value = res.data; orderInfo.value = res.data;
}; };

View File

@@ -33,19 +33,19 @@
item.status === 0 item.status === 0
? '#FF850A' ? '#FF850A'
: item.status === 1 : item.status === 1
? '#F83D3D' ? '#F83D3D'
: item.status === 2 : item.status === 2
? '#333333' ? '#333333'
: '#9C9C9C', : '#9C9C9C',
}" }"
>{{ >{{
item.status === 0 item.status === 0
? '待付款' ? '待付款'
: item.status === 1 : item.status === 1
? '待使用' ? '待使用'
: item.status === 2 : item.status === 2
? '已使用' ? '已使用'
: '已失效' : '已失效'
}} }}
</view> </view>
</view> </view>
@@ -86,9 +86,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getActiveOrderList} from '../../../../api/admin'; import { getActiveOrderList } from '../../../../api/admin';
const opt = ref([ const opt = ref([
{ {

View File

@@ -116,9 +116,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref, computed, h} from 'vue'; import { ref, computed, h } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {growthRate} from '../../../api/admin'; import { growthRate } from '../../../api/admin';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import uCharts from '../../../utils/js_sdk/u-charts.min.js'; import uCharts from '../../../utils/js_sdk/u-charts.min.js';

View File

@@ -4,14 +4,86 @@
<image <image
class="image" class="image"
@tap="scanCode" @tap="scanCode"
src="http://p1.meituan.net/csc/696924dda634f05689dabdfbb18e88cc13551.png" /> src="https://p1.meituan.net/csc/696924dda634f05689dabdfbb18e88cc13551.png" />
<view class="mt-2 text-[#7A7A7A]">扫描二维码核销</view> <view class="mt-2 text-[#7A7A7A]">扫描二维码核销</view>
</view> </view>
<view class="bg-white p-2">
<view class="mt-2 text-center text-[#7A7A7A]">最近核销记录</view>
<view v-if="list.length > 0">
<view
class="order-card"
v-for="(item, index) in list"
:key="index"
@click="toDetailPage(item)">
<view class="top">
<view class="text-[#9C9C9C] text-[25px]"
>订单号{{ item.oid }}</view
>
<view
:style="{
color:
item.status === 0
? '#FF850A'
: item.status === 1
? '#F83D3D'
: item.status === 2
? '#333333'
: '#9C9C9C',
}"
>{{
item.status === 0
? '待付款'
: item.status === 1
? '待使用'
: item.status === 2
? '已使用'
: '已失效'
}}
</view>
</view>
<view class="line"></view>
<view class="center" v-for="(itm, idx) in item.OrderGoods" :key="idx">
<view class="top">
<image class="mr-10" :src="itm.Goods.cover" />
<view class="flex-1">
<view class="title">{{ itm.Goods?.name }}</view>
<view class="text-[#F83D3D] mt-5">
<view
>{{ itm.pay_price }}
<text v-if="itm.pay_integral > 0"
>+{{ itm.pay_integral }}积分</text
>
</view>
</view>
</view>
<view class="right">
<view>x{{ itm.number }}</view>
</view>
</view>
</view>
<view
class="flex justify-between items-center mt-2 mb-2 text-[25px]"
v-if="item.status !== 0">
<text class="text-[#9C9C9C]">{{ item.count }}件商品</text>
<text class="text-[26px] flex-1 text-right"
>{{ item.status !== 0 ? '实' : '应' }}付款:
{{ item.discount_price }} ()
<text v-if="item.exchange > 0"
>积分抵扣: {{ item.exchange }}</text
>
</text>
</view>
</view>
</view>
<nut-empty v-else description="暂无数据"></nut-empty>
</view>
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { getActiveOrderList } from '@/api/admin';
import { ref } from 'vue';
// url参数转对象 // url参数转对象
// const urlParse = (url: string) => { // const urlParse = (url: string) => {
@@ -47,12 +119,42 @@ const scanCode = () => {
}, },
}); });
}; };
Taro.useLoad(() => {
getListOne();
});
const list = ref<any[]>([]);
const getListOne = async () => {
try {
const { data } = Taro.getStorageSync('userInfo');
const res = await getActiveOrderList({
PageNum: 1,
PageSize: 1,
bid: data.bid,
status: 0,
});
list.value = [res.data.data[0]];
console.log(list.value);
} catch (error) {
console.log(error);
}
};
const toDetailPage = (item: any) => {
Taro.setStorageSync('ver_order_info', item);
Taro.navigateTo({
url: '/pages/admin/order_manage/detail/index',
});
};
</script> </script>
<style lang="scss"> <style lang="scss">
page { page {
background-color: #f5f5f5; background-color: #f5f5f5;
background-image: url('http://p0.meituan.net/csc/e6ff5582788af2023f49241afe22fc89391851.png'); background-image: url('https://p0.meituan.net/csc/e6ff5582788af2023f49241afe22fc89391851.png');
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 100% 25%; background-size: 100% 25%;
} }
@@ -62,7 +164,7 @@ page {
height: 300px; height: 300px;
box-sizing: border-box; box-sizing: border-box;
background-color: #fff; background-color: #fff;
margin: 300px auto; margin: 300px auto 50px auto;
border-radius: 33px; border-radius: 33px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -75,4 +177,62 @@ page {
height: 150px; height: 150px;
} }
} }
.order-card {
box-sizing: border-box;
margin: 15px auto;
background-color: #fff;
padding: 20px;
.line {
width: 100%;
height: 1px;
background-color: #f5f5f5;
margin: 10px;
}
.top {
display: flex;
justify-content: space-between;
align-items: center;
}
.btn {
display: flex;
justify-content: flex-end;
align-items: center;
}
.center {
// margin-bottom: 10px;
.top {
display: flex;
// justify-content: space-between;
align-items: flex-start;
image {
width: 150px;
height: 150px;
border-radius: 15px;
margin-right: 10px;
}
.title {
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
width: 350px;
}
.right {
margin-left: 10px;
font-size: 28px;
text-align: right;
color: #9c9c9c;
}
}
}
}
</style> </style>

View File

@@ -59,8 +59,8 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getActiveVerifyList, activeOrderVerify} from '@/api/admin'; import { getActiveVerifyList, activeOrderVerify } from '@/api/admin';
import {ref} from 'vue'; import { ref } from 'vue';
const opt = ref<any>({}); const opt = ref<any>({});
@@ -97,15 +97,21 @@ const subVerify = async () => {
oid: goodInfo.value.oid, oid: goodInfo.value.oid,
bid: goodInfo.value.bid, bid: goodInfo.value.bid,
}); });
Taro.showToast({ //Taro.showToast({
title: res.msg, // title: res.msg,
icon: 'none', // icon: 'none',
//});
Taro.showModal({
title: '核销成功',
content: res.msg,
success: () => {
setTimeout(() => {
Taro.navigateBack({
delta: 1,
});
}, 3000);
},
}); });
setTimeout(() => {
Taro.navigateBack({
delta: 1,
});
}, 3000);
} catch (error) { } catch (error) {
Taro.showToast({ Taro.showToast({
title: error.msg, title: error.msg,
@@ -122,7 +128,9 @@ const getPayType = (type: number) => {
case 2: case 2:
return '平台积分支付'; return '平台积分支付';
case 3: case 3:
return '天才小猪支付'; return '智多鑫积分支付';
case 3:
return '渔乐潮玩支付';
default: default:
return '未知'; return '未知';
} }

View File

@@ -41,7 +41,7 @@
.card { .card {
margin: 20px auto; margin: 20px auto;
background-image: url('http://p0.meituan.net/csc/902ecf4ba9765a8200817d58a3a5a655172781.png'); background-image: url('https://p0.meituan.net/csc/902ecf4ba9765a8200817d58a3a5a655172781.png');
background-size: 100% 100%; background-size: 100% 100%;
width: 95%; width: 95%;
height: 250px; height: 250px;

View File

@@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getWithdrawList, addWithdraw} from '@/api/admin'; import { getWithdrawList, addWithdraw } from '@/api/admin';
const user_info = ref<any>({}); const user_info = ref<any>({});
@@ -57,7 +57,7 @@ const getData = async () => {
const add = async () => { const add = async () => {
try { try {
formRef.value?.validate().then(async ({valid}) => { formRef.value?.validate().then(async ({ valid }) => {
if (valid) { if (valid) {
const res = await addWithdraw({ const res = await addWithdraw({
Bid: user_info.value.data.bid, Bid: user_info.value.data.bid,
@@ -156,7 +156,7 @@ Taro.useReachBottom(() => {
<!-- <view class="flex items-center" @click="visible1 = true"> <!-- <view class="flex items-center" @click="visible1 = true">
<image <image
class="w-[26px] h-[26px]" class="w-[26px] h-[26px]"
src="http://p1.meituan.net/csc/5437a800f4ed4a49f14984494c1c3077994.png"></image> src="https://p1.meituan.net/csc/5437a800f4ed4a49f14984494c1c3077994.png"></image>
<view class="text-[#EC4443] text-[26px] ml-1">提现疑问</view> <view class="text-[#EC4443] text-[26px] ml-1">提现疑问</view>
</view> --> </view> -->
</view> </view>
@@ -195,15 +195,15 @@ Taro.useReachBottom(() => {
item.status === 1 item.status === 1
? 'success' ? 'success'
: item.status === 1 : item.status === 1
? 'danger' ? 'danger'
: 'warning' : 'warning'
" "
>{{ >{{
item.status === 1 item.status === 1
? '已打款' ? '已打款'
: item.status === 2 : item.status === 2
? '已拒绝' ? '已拒绝'
: '待审核' : '待审核'
}}</view }}</view
> >
</view> </view>

View File

@@ -19,9 +19,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getAllMerCategory} from '@/api/goods'; import { getAllMerCategory } from '@/api/goods';
const list = ref< const list = ref<
{ {

View File

@@ -80,10 +80,10 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {nextTick, ref} from 'vue'; import { nextTick, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {addCart, getAllCart} from '@/api/cart'; import { addCart, getAllCart } from '@/api/cart';
import {createActiveOrder} from '@/api/goods'; import { createActiveOrder } from '@/api/goods';
import Pay from '@/components/Pay.vue'; import Pay from '@/components/Pay.vue';
interface CardList { interface CardList {
@@ -206,7 +206,7 @@ const sub = async () => {
}); });
return; return;
} }
const {data: res} = await createActiveOrder({ const { data: res } = await createActiveOrder({
Bid: arr.map((item: any) => item.StoreBid), Bid: arr.map((item: any) => item.StoreBid),
}); });
if (res.oid) { if (res.oid) {

View File

@@ -10,12 +10,12 @@
@change="tabChange"> @change="tabChange">
<nut-tab-pane <nut-tab-pane
v-for="item in list" v-for="item in list"
:title="(item.name as string)" :title="item.name as string"
:key="item.ID"> :key="item.ID">
<view v-if="goodList.length > 0"> <view v-if="goodList.length > 0">
<view <view
class="list" class="list"
v-for="(item, index) in (goodList as any)" v-for="(item, index) in goodList as any"
:key="index"> :key="index">
<view class="item"> <view class="item">
<img :src="item.cover" /> <img :src="item.cover" />
@@ -44,8 +44,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {ref} from 'vue'; import { ref } from 'vue';
import {getCategoryList, getCategoryGoods} from '@/api/goods'; import { getCategoryList, getCategoryGoods } from '@/api/goods';
const val = ref(0); const val = ref(0);

View File

@@ -46,11 +46,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getHdOrJfGoods, createActiveOrder} from '@/api/goods'; import { getHdOrJfGoods, createActiveOrder } from '@/api/goods';
import {getUserPoint} from '@/api/admin'; import { getUserPoint } from '@/api/admin';
import {addCart} from '@/api/cart'; import { addCart } from '@/api/cart';
import Back from '@/components/Back.vue'; import Back from '@/components/Back.vue';
const par = ref<any>({}); const par = ref<any>({});

View File

@@ -1,4 +1,4 @@
export default definePageConfig({ export default definePageConfig({
navigationBarTitleText: '游戏详情', navigationBarTitleText: '游戏详情',
navigationStyle: 'custom', // navigationStyle: 'custom',
}); });

View File

@@ -0,0 +1,43 @@
// page {
// font-size: 10px;
// }
.index {
position: relative;
width: 100%;
height: 100vh;
.swiper {
background-color: white;
width: 100%;
}
.container {
z-index: 1;
position: absolute;
top: 260px;
background-color: white;
box-sizing: border-box;
width: 100%;
padding: 10px;
text-align: center;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
.btn {
margin: 20px auto;
padding: 10px;
border-radius: 50px;
background-color: #7950f2;
color: #fff;
width: 300px;
text-align: center;
border: 1px solid #f5f5f5;
}
}
}
.text {
padding: 10px;
font-size: 30px;
text-align: left;
}

View File

@@ -1,153 +1,52 @@
<template> <template>
<view> <view class="index">
<view <swiper class="swiper" :circular="true" :autoplay="true">
class="head-wrapper" <swiper-item v-for="(item, index) in list" :key="index">
:style="{ <image style="width: 100%" :src="item" />
top: statusHeight + 'px', </swiper-item>
}"> </swiper>
<view class="head-menu"> <view class="container">
<Left class="iconfont" @click="returns" /> <rich-text :nodes="info.introduction"></rich-text>
<Home class="iconfont" @click="goHome" /> <view class="btn" @click="startGame()">开始游戏</view>
</view>
</view>
<nut-swiper
class="swiper"
:pagination-visible="true"
pagination-color="#426543"
auto-play="3000">
<nut-swiper-item>
<image
src="https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg"
alt="" />
</nut-swiper-item>
<nut-swiper-item>
<image
src="https://storage.360buyimg.com/jdc-article/NutUItaro2.jpg"
alt="" />
</nut-swiper-item>
<nut-swiper-item>
<image
src="https://storage.360buyimg.com/jdc-article/welcomenutui.jpg"
alt="" />
</nut-swiper-item>
<nut-swiper-item>
<image
src="https://storage.360buyimg.com/jdc-article/fristfabu.jpg"
alt="" />
</nut-swiper-item>
</nut-swiper>
<view class="box">
<view class="line"></view>
<view class="game-title"></view>
<view class="game-title"></view>
<view class="game-title"></view>
<view class="game-btn" @click="toGame()">开始游戏</view>
</view> </view>
</view> </view>
</template> </template>
<script setup lang="ts"> <script lang="ts" setup>
import {ref} from 'vue'; import { ref } from 'vue';
import { import Taro from '@tarojs/taro';
useLoad, import './index.scss';
getSystemInfoSync,
navigateBack,
switchTab,
navigateTo,
} from '@tarojs/taro';
import {Left, Home} from '@nutui/icons-vue-taro';
var statusBarHeight = getSystemInfoSync().statusBarHeight as number;
console.log(statusBarHeight); const info = ref<any>({});
const list = ref<string[]>([]);
const statusHeight = ref<number>(statusBarHeight); Taro.useLoad(() => {
info.value = Taro.getStorageSync('gameItem');
// const swiperList = ref([]); list.value.push(info.value.cover);
useLoad(options => {
console.log(options);
}); });
const returns = () => { const startGame = () => {
navigateBack(); // 判断url中是否含有http
}; if (info.value.url.indexOf('http') === -1) {
Taro.navigateTo({
const goHome = () => { url: info.value.url,
switchTab({ });
url: '/pages/index/index', } else {
}); const user = Taro.getStorageSync('userInfo');
}; // if (user.data.pulse <= 0)
// return Taro.showToast({
const toGame = () => { // title: '您的豆子不足,无法进入游戏',
navigateTo({ // icon: 'none',
url: '/pages/game/gameview/index', // });
}); Taro.setStorageSync(
'game_url',
`${info.value.url}?uid=${Taro.getStorageSync('token')}&id=${
info.value.ID
}`,
);
Taro.navigateTo({
url: `/pages/game/view/index`,
});
}
}; };
</script> </script>
<style lang="scss">
.head-wrapper {
z-index: 999;
display: flex;
align-items: center;
position: fixed;
left: 30px;
top: 0;
height: 100px;
}
.head-menu {
display: flex;
align-items: center;
height: 54px;
width: 140px;
background: rgba(0, 0, 0, 0.25);
border-radius: 27px;
.iconfont {
flex: 1;
text-align: center;
color: #fff;
box-sizing: border-box;
&.icon-xiangzuo {
border-right: 1px solid #fff;
}
}
}
.swiper {
height: 450rpx;
width: 100vw;
image {
width: 100%;
}
}
.box {
width: 100%;
height: 90vh;
background-color: #fff;
z-index: 1;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
box-sizing: border-box;
position: absolute;
padding: 20px;
top: 400px;
.line {
width: 90px;
height: 10px;
border-radius: 4px;
background-color: rgba(202, 202, 202, 1);
margin: auto;
}
.game-btn {
width: 300px;
height: 75px;
margin: 50px auto;
color: #fff;
background-color: rgba(85, 77, 132, 1);
border-radius: 50px;
text-align: center;
line-height: 75px;
}
}
</style>

View File

@@ -1,3 +1,4 @@
export default definePageConfig({ export default definePageConfig({
navigationBarTitleText: '', navigationBarTitleText: '游戏大厅',
// navigationStyle: 'custom',
}); });

View File

@@ -1,20 +1,32 @@
<template> <template>
<view> <view class="index">
<web-view :src="url"></web-view> <!-- <view class="title">游戏大厅</view> -->
<view class="card_list">
<view
class="card_item"
v-for="item in list"
:key="item.ID"
:style="{ backgroundImage: `url(${item.cover})` }"
@click="toPage(item)"></view>
</view>
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { getPersonalInfo } from '@/api/user';
import { getGameList } from '@/api/game';
const url = ref(''); const list = ref<any[]>([]);
Taro.useDidShow(() => { Taro.useDidShow(() => {
const token = Taro.getStorageSync('token'); const token = Taro.getStorageSync('token');
// url.value = 'http://huakk.jdt168.com/#/pages/index/index'; // url.value = 'https://huakk.jdt168.com/#/pages/index/index';
if (token) { if (token) {
url.value = `${process.env.TARO_APP_GAME}${Taro.getStorageSync('token')}`; // url.value = `${process.env.TARO_APP_GAME}${Taro.getStorageSync('token')}`;
getUserInfo();
getList();
} else { } else {
Taro.showToast({ Taro.showToast({
title: '请先登录,再尝试进入游戏大厅。', title: '请先登录,再尝试进入游戏大厅。',
@@ -27,6 +39,77 @@ Taro.useDidShow(() => {
}, 1000); }, 1000);
} }
}); });
const getUserInfo = async () => {
const res = await getPersonalInfo();
const userInfo = {
...res.data,
data: {
...res.data.data,
permission: res.data.data.permission
? JSON.parse(res.data.data.permission)
: {},
},
};
Taro.setStorageSync('userInfo', userInfo);
};
const getList = async () => {
// console.log(process.env.TARO_APP_HALL_API)
const res = await getGameList();
list.value = res.data.data.sort((a: any, b: any) => b.sort - a.sort) || [];
};
const toPage = item => {
Taro.setStorageSync('gameItem', item);
Taro.navigateTo({
url: `/pages/game/gamedetail/index`,
});
};
</script> </script>
<style lang="scss"></style> <style lang="scss">
.index {
padding-top: 10px;
width: 100%;
height: 100vh;
.title {
margin: 60px;
font-size: 50px;
}
.card_list {
display: flex;
justify-content: center;
flex-wrap: wrap;
.card_item {
width: 700px;
height: 300px;
background-color: #fff;
margin-bottom: 20px;
border-radius: 20px;
text-align: center;
line-height: 300px;
// background-image: url('../../static/qietu.png');
background-size: 100% 100%;
position: relative;
// .btn {
// position: absolute;
// width: 150px;
// height: 100px;
// background-image: url('../../static/an.png');
// background-size: 100% 100%;
// right: 30px;
// bottom: 10px;
// &:active {
// transform: scale(1.1);
// }
// }
}
}
}
</style>

View File

@@ -1,3 +0,0 @@
export default definePageConfig({
navigationBarTitleText: 'GameView',
});

View File

@@ -1,20 +0,0 @@
<template>
<web-view
style="height: 100vh; width: 100vw"
:src="`https://www.jdt168.com/public/?uid=${user.uid}`"></web-view>
</template>
<script setup lang="ts">
import {ref} from 'vue';
import {getStorageSync, useLoad} from '@tarojs/taro';
import {WebView} from '@tarojs/components';
const user = ref<any>({});
useLoad(() => {
user.value = getStorageSync('userInfo');
console.log(user);
});
</script>
<style lang="scss"></style>

View File

@@ -1,11 +1,11 @@
<template> <template>
<web-view style="height: 100vh; width: 100vw" :src="url"></web-view> <web-view class="web-view" :src="url"></web-view>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import {getStorageSync, useDidShow} from '@tarojs/taro'; import { getStorageSync, useDidShow } from '@tarojs/taro';
import {WebView} from '@tarojs/components'; import { WebView } from '@tarojs/components';
const url = ref(''); const url = ref('');
@@ -14,4 +14,10 @@ useDidShow(() => {
}); });
</script> </script>
<style lang="scss"></style> <style lang="scss">
.web-view {
// 适配ios底部安全区域
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
</style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<view class="app"> <view class="app">
<view class="head-wrapper" :style="{top: BarHeight + 'px'}"> <view class="head-wrapper" :style="{ top: BarHeight + 'px' }">
<view class="head-menu"> <view class="head-menu">
<Left class="iconfont" @click="returns" /> <Left class="iconfont" @click="returns" />
<Home class="iconfont" @click="goHome" /> <Home class="iconfont" @click="goHome" />
@@ -62,13 +62,13 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {Ref, ref} from 'vue'; import { Ref, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {Home, Left} from '@nutui/icons-vue-taro'; import { Home, Left } from '@nutui/icons-vue-taro';
import {getActiveGoodsDetail, getMerDetail} from '@/api/goods'; import { getActiveGoodsDetail, getMerDetail } from '@/api/goods';
import Cart from '@/components/Cart.vue'; import Cart from '@/components/Cart.vue';
import {Cart2} from '@nutui/icons-vue-taro'; import { Cart2 } from '@nutui/icons-vue-taro';
import {nextTick} from 'vue'; import { nextTick } from 'vue';
const statusBarHeight = Taro.getSystemInfoSync()?.statusBarHeight; const statusBarHeight = Taro.getSystemInfoSync()?.statusBarHeight;
const BarHeight = ref((statusBarHeight as number) + 7); const BarHeight = ref((statusBarHeight as number) + 7);
@@ -105,7 +105,7 @@ Taro.useLoad(async options => {
}); });
const getMerInfo = async () => { const getMerInfo = async () => {
const res = await getMerDetail({bid: bid.value}); const res = await getMerDetail({ bid: bid.value });
mer_info.value = res.data.data; mer_info.value = res.data.data;
}; };
@@ -117,7 +117,7 @@ Taro.useShareAppMessage(() => ({
const get_good_detail = async (gid: string) => { const get_good_detail = async (gid: string) => {
try { try {
const res = await getActiveGoodsDetail({gid: gid}); const res = await getActiveGoodsDetail({ gid: gid });
goodInfo.value = { goodInfo.value = {
...res.data.data, ...res.data.data,
// details: res.data.data.details., // details: res.data.data.details.,

View File

@@ -48,10 +48,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {Find} from '@nutui/icons-vue-taro'; import { Find } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {calculateDistance} from '@/utils'; import { calculateDistance } from '@/utils';
import {ref} from 'vue'; import { ref } from 'vue';
const distance = ref(''); const distance = ref('');

View File

@@ -24,7 +24,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {Check, CloseLittle} from '@nutui/icons-vue-taro'; import { Check, CloseLittle } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
const toHome = () => { const toHome = () => {

View File

@@ -66,8 +66,8 @@
item.number > 0 item.number > 0
? `可用积分:${item.number}` ? `可用积分:${item.number}`
: item.name.includes('微信') : item.name.includes('微信')
? '微信全额支付' ? '微信全额支付'
: '' : ''
" "
@click="cellClick(item.ID)"> @click="cellClick(item.ID)">
<template #icon> <template #icon>
@@ -95,10 +95,10 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {IconFont} from '@nutui/icons-vue-taro'; import { IconFont } from '@nutui/icons-vue-taro';
import {onUnmounted, ref} from 'vue'; import { onUnmounted, ref } from 'vue';
import {getActiveOrderDetail, getPayList} from '@/api/goods'; import { getActiveOrderDetail, getPayList } from '@/api/goods';
import {payOrder} from '@/api/order'; import { payOrder } from '@/api/order';
import * as dayjs from 'dayjs'; import * as dayjs from 'dayjs';
const payVal = ref(); const payVal = ref();
@@ -114,7 +114,7 @@ const isLoading = ref(false);
const opt = ref<any>({}); const opt = ref<any>({});
Taro.useLoad(e => { Taro.useLoad(e => {
const {oid, bid, OrderType} = e; const { oid, bid, OrderType } = e;
opt.value = e; opt.value = e;
get_pay_list(); get_pay_list();
getData(oid, bid, OrderType); getData(oid, bid, OrderType);
@@ -176,7 +176,7 @@ const pay = async () => {
if (isLoading.value) return; if (isLoading.value) return;
isLoading.value = true; isLoading.value = true;
if (!payVal.value) if (!payVal.value)
return Taro.showToast({title: '请选择支付方式', icon: 'none'}); return Taro.showToast({ title: '请选择支付方式', icon: 'none' });
await confirmPay(); await confirmPay();
} catch (error) { } catch (error) {
Taro.showToast({ Taro.showToast({
@@ -188,23 +188,22 @@ const pay = async () => {
const confirmPay = async () => { const confirmPay = async () => {
try { try {
const res = await payOrder({ const { data: res } = await payOrder({
oid: opt.value.oid, oid: opt.value.oid,
OrderType: payVal.value, OrderType: payVal.value,
PayType: payVal.value, PayType: payVal.value,
}); });
Taro.requestPayment({ Taro.requestPayment({
timeStamp: res.data.data.timeStamp, timeStamp: res.data.timeStamp,
nonceStr: res.data.data.nonceStr, nonceStr: res.data.nonceStr,
package: res.data.data.package, package: res.data.package,
signType: res.data.data.signType, signType: res.data.signType,
paySign: res.data.data.paySign, paySign: res.data.paySign,
success: function () { success: function () {
Taro.showToast({ Taro.showToast({
title: '支付成功', title: '支付成功',
icon: 'success', icon: 'success',
}); });
isLoading.value = false;
}, },
fail: function () { fail: function () {
Taro.showToast({ Taro.showToast({
@@ -214,11 +213,10 @@ const confirmPay = async () => {
}, },
complete: function () { complete: function () {
setTimeout(() => { setTimeout(() => {
Taro.redirectTo({ Taro.reLaunch({
url: `/pages/users/order_list/index?type=0`, url: `/pages/users/order_list/index?type=0`,
}); });
}, 2000); }, 2000);
// isLoading.value = false;
}, },
}); });
} catch (err) { } catch (err) {
@@ -227,7 +225,7 @@ const confirmPay = async () => {
icon: 'none', icon: 'none',
}); });
} finally { } finally {
// isLoading.value = false; isLoading.value = false;
} }
}; };

View File

@@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import {ref} from 'vue'; import { ref } from 'vue';
import { import {
useLoad, useLoad,
useReachBottom, useReachBottom,
@@ -8,8 +8,8 @@ import {
setStorageSync, setStorageSync,
} from '@tarojs/taro'; } from '@tarojs/taro';
import Pay from '@/components/Pay.vue'; import Pay from '@/components/Pay.vue';
import {getActiveOrderList, deleteActiveOrder} from '@/api/goods'; import { getActiveOrderList, deleteActiveOrder } from '@/api/goods';
import {getOrderStatistics} from '@/api/order'; import { getOrderStatistics } from '@/api/order';
const tabValue = ref(0); const tabValue = ref(0);
@@ -189,7 +189,9 @@ const delOrder = async (oid: string) => {
@click="tabChange(item.value)"> @click="tabChange(item.value)">
<view class="text">{{ item.title }}</view> <view class="text">{{ item.title }}</view>
<view>{{ item.num }}</view> <view>{{ item.num }}</view>
<view class="line" :class="{lineColor: item.value === tabValue}"></view> <view
class="line"
:class="{ lineColor: item.value === tabValue }"></view>
</view> </view>
</view> </view>
<view v-if="orderList.length > 0"> <view v-if="orderList.length > 0">
@@ -201,10 +203,10 @@ const delOrder = async (oid: string) => {
item.status === 0 item.status === 0
? '待付款' ? '待付款'
: item.status === 1 : item.status === 1
? '待使用' ? '待使用'
: item.status === 2 : item.status === 2
? '已使用' ? '已使用'
: '已失效' : '已失效'
}} }}
</view> </view>
</view> </view>

View File

@@ -5,7 +5,7 @@
<view class="item"> <view class="item">
<view @click="hotGoodsDetail"> <view @click="hotGoodsDetail">
<IconFont <IconFont
name="http://article.biliimg.com/bfs/article/131eda0add8662808d97ffb1191d19bf3e420647.png" name="https://article.biliimg.com/bfs/article/131eda0add8662808d97ffb1191d19bf3e420647.png"
size="40" /> size="40" />
<view>我的订单</view> <view>我的订单</view>
</view> </view>
@@ -44,10 +44,10 @@
<view class="goodBox"> <view class="goodBox">
<view <view
class="good" class="good"
v-for="item in (merdata as any)" v-for="item in merdata as any"
:key="item.ID" :key="item.ID"
@click.stop="toMerDetails(item)"> @click.stop="toMerDetails(item)">
<image :src="(item.head_photo as string)" /> <image :src="item.head_photo as string" />
<view class="good-text-box"> <view class="good-text-box">
<text class="good-text">{{ item.name }}</text> <text class="good-text">{{ item.name }}</text>
<text style="color: #999" <text style="color: #999"
@@ -67,14 +67,14 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { import {
// getActiveGoods, // getActiveGoods,
getMerList, getMerList,
} from '../../../api/goods'; } from '../../../api/goods';
import {IconFont} from '@nutui/icons-vue-taro'; import { IconFont } from '@nutui/icons-vue-taro';
import {calculateDistance} from '@/utils'; import { calculateDistance } from '@/utils';
// const list = ref<any>([]); // const list = ref<any>([]);
@@ -129,7 +129,7 @@ const get_mer_list = async () => {
const toMerDetails = (item: any) => { const toMerDetails = (item: any) => {
Taro.setStorageSync('mer_info', item); Taro.setStorageSync('mer_info', item);
Taro.navigateTo({ Taro.navigateTo({
url: `/pages/mer/mer_detail/index`, url: `/pages/mer/mer_detail/index?bid=${item.bid}`,
}); });
}; };
</script> </script>

View File

@@ -0,0 +1,877 @@
<template>
<view class="home-new">
<!-- Header & Search -->
<view class="header-fixed">
<view :style="{ paddingTop: statusBarHeight + 'px' }"></view>
<view class="header-content">
<!-- Location -->
<view class="location-bar">
<view class="location-inner" @click="getUserLocal">
<view class="iconfont icon-dizhi location-icon"></view>
<text class="location-text">{{ address }}</text>
<view class="iconfont icon-xiangxia location-arrow"></view>
</view>
</view>
<!-- Search Bar -->
<view class="search-container">
<input
type="text"
placeholder="请输入商家名称搜索"
class="search-input"
v-model="searchVal" />
<view class="search-icon-left">
<view class="iconfont icon-sousuo"></view>
</view>
<view class="search-btn" @click.stop="clickSearch">搜索</view>
</view>
</view>
</view>
<!-- Main Content -->
<view class="main-content">
<!-- Banner / Hero -->
<view class="banner-hero">
<!-- Background Pattern Decoration -->
<view class="banner-decoration banner-decoration-top"></view>
<view class="banner-decoration banner-decoration-bottom"></view>
<view class="banner-inner">
<view class="banner-title">
玩赚积分<text class="banner-title-yellow">商城</text>
</view>
<view class="banner-subtitle-wrapper">
<view class="banner-divider"></view>
<text class="banner-subtitle">积分当钱花 · 兑换无上限</text>
<view class="banner-divider"></view>
</view>
<view class="banner-buttons">
<view class="banner-btn banner-btn-primary">
<text class="banner-btn-icon">💎</text> 积分兑换
</view>
<view class="banner-btn banner-btn-secondary">同城兑换</view>
</view>
</view>
</view>
<!-- Quick Actions Grid -->
<view class="nav-grid-wrapper">
<view class="nav-grid">
<view
class="nav-item"
v-for="(item, index) in navigationList"
:key="index"
@click="toPage(item)">
<view class="nav-icon-wrapper">
<image :src="item.icon" class="nav-icon" mode="aspectFit" />
</view>
<text class="nav-label">{{ item.name }}</text>
</view>
</view>
</view>
<!-- Store List -->
<view class="store-section">
<view class="store-header">
<view class="store-header-line"></view>
附近商家
</view>
<view class="store-list">
<view
class="store-item"
v-for="(item, index) in merList"
:key="index"
@click="toMerDetails(item)">
<view class="store-image-wrapper">
<image
:src="item.head_photo"
class="store-image"
mode="aspectFill" />
<!-- <view class="store-badge" v-if="index < 3">严选</view> -->
</view>
<view class="store-info">
<view class="store-name">{{ item.name }}</view>
<view class="store-rating">
<view class="rating-stars">
<text class="stars-text"></text>
<text class="rating-score">5.0</text>
</view>
<text class="rating-divider">|</text>
<text class="rating-sales">月售 1000+</text>
</view>
<view class="store-distance">
<text class="distance-placeholder">.</text>
<text class="distance-text">
距离我{{
calculateDistance(
userLocalNum.t,
userLocalNum.l,
Number(item.lat),
Number(item.lon),
)
}}
</text>
</view>
</view>
</view>
<!-- Empty State -->
<view v-if="merList.length === 0" class="store-empty">
暂无附近商家
</view>
</view>
</view>
</view>
<Popup :imgArr="imgList" />
</view>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
import { ref } from 'vue';
import { getHomeList } from '@/api/home';
import { getMerList } from '@/api/goods';
import { bindParent } from '@/api/user';
import { calculateDistance } from '@/utils';
import Popup from '@/components/Popup.vue';
const statusBarHeight = Taro.getSystemInfoSync().statusBarHeight || 20;
const address = ref('获取位置中...');
const searchVal = ref('');
const navigationList = ref<any[]>([]);
const merList = ref<any[]>([]);
const pageVal = ref({
page: 1,
total: 0,
});
const userLocalNum = ref({
l: 0,
t: 0,
});
const imgList = ref([require('../../../static/zhenggai.png')]);
// Lifecycle
Taro.useLoad(() => {
getPrivacy();
getUserLocal();
getNavLists();
checkBindParent();
});
Taro.useShareAppMessage(() => ({
title: '捷兑通',
path: `/pages/index/index?scene=${Taro.getStorageSync('token')}`,
imageUrl: 'https://upload.jdt168.com/1714375021923881119_Share.jpg',
}));
Taro.useReachBottom(() => {
if (merList.value.length >= pageVal.value.total) {
if (pageVal.value.total > 0) {
Taro.showToast({ title: '没有更多了', icon: 'none' });
}
return;
}
pageVal.value.page += 1;
fetchMerList();
});
// Methods
const checkBindParent = async () => {
if (Taro.getStorageSync('token') && Taro.getStorageSync('bind_id')) {
try {
const res: any = await bindParent({
uid: Taro.getStorageSync('bind_id'),
});
Taro.showToast({
title: res.msg,
});
Taro.removeStorageSync('bind_id');
} catch (error) {
Taro.removeStorageSync('bind_id');
}
}
};
const getPrivacy = () => {
Taro.getPrivacySetting({
success: res => {
if (res.needAuthorization) {
Taro.requirePrivacyAuthorize({
success: () => console.log('用户同意授权'),
fail: () => {
console.log('用户拒绝授权');
// Taro.exitMiniProgram();
},
});
}
},
});
};
const getUserLocal = () => {
Taro.getLocation({
type: 'wgs84',
success: res => {
userLocalNum.value.l = res.longitude;
userLocalNum.value.t = res.latitude;
fetchAddress(res.latitude, res.longitude);
// Refresh list with location
pageVal.value.page = 1;
merList.value = [];
fetchMerList();
},
fail: () => {
address.value = '未能获取定位';
// Load list anyway
fetchMerList();
},
});
};
const fetchAddress = (lat, lon) => {
Taro.request({
url: `https://api.tianditu.gov.cn/geocoder?postStr={'lon':${lon},'lat':${lat},'ver':1}&type=geocode&tk=42db4f3dfd1a18d31e73ee90aa2ce054`,
method: 'GET',
success: res => {
const { msg, result } = res.data;
if (msg === 'ok') {
address.value = `${result.addressComponent.county}${result.addressComponent.town}${result.addressComponent.address}`;
}
},
});
};
const getNavLists = async () => {
const defaults = [
{
type: 1,
icon: '//p0.meituan.net/csc/f33ad2443a67e9f3474a1d5fd9d529db7504.png',
url: '/pages/users/settled_mer/index',
name: '商户入驻',
},
{
type: 1,
icon: '//p0.meituan.net/csc/0403cf37dd14a6b44b22ffccaa2878f95703.png',
url: '/pages/allClassList/index',
name: '全部服务',
},
];
try {
const res = await getHomeList();
const apiList = res.data.data.map(item => ({
ID: item.ID,
type: 2,
icon: item.icon,
url: item.url,
name: item.name,
}));
navigationList.value = [...apiList, ...defaults];
} catch (e) {
console.error(e);
navigationList.value = defaults;
}
};
const fetchMerList = async () => {
try {
const res = await getMerList({
PageNum: pageVal.value.page,
PageSize: 10,
// class_id: 0
});
pageVal.value.total = res.data.total;
if (res.data.data) {
merList.value.push(...res.data.data);
}
} catch (e) {
console.error(e);
}
};
const clickSearch = () => {
if (!searchVal.value)
return Taro.showToast({ title: '请输入商家名称', icon: 'none' });
Taro.navigateTo({ url: `/pages/search/index?name=${searchVal.value}` });
searchVal.value = '';
};
const toPage = item => {
item.type !== 1
? Taro.navigateTo({
url: `/pages/search/index?id=${item.ID}&name=${item.name}`,
})
: Taro.navigateTo({ url: item.url });
};
const toMerDetails = item => {
Taro.navigateTo({ url: `/pages/mer/mer_detail/index?bid=${item.bid}` });
};
</script>
<style lang="scss">
/* 所有新版样式包裹在 .home-new 作用域下 */
.home-new {
background-color: #f5f6f7;
min-height: 100vh;
/* Header Styles */
.header-fixed {
position: sticky;
top: 0;
z-index: 50;
background: linear-gradient(180deg, #eff6ff 0%, #f5f6f7 100%);
}
.header-content {
padding: 10px 20px 10px;
}
.location-bar {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
font-size: 22px;
color: #6b7280;
}
.location-inner {
display: flex;
align-items: center;
max-width: 90%;
background-color: rgba(255, 255, 255, 0.6);
padding: 8px 16px;
border-radius: 50px;
backdrop-filter: blur(10px);
}
.location-icon {
width: 26px;
height: 26px;
margin-right: 8px;
color: #374151;
}
.location-text {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 500;
}
.location-arrow {
width: 20px;
height: 20px;
margin-left: 8px;
color: #9ca3af;
}
.search-container {
position: relative;
// margin: 10px auto;
margin-top: 20px;
}
.search-input {
height: 70px;
background-color: #ffffff;
border: none;
border-radius: 20px;
padding: 10px 20px 10px 70px;
font-size: 28px;
}
.search-icon-left {
position: absolute;
left: 20px;
top: 50%;
transform: translateY(-50%);
color: #9ca3af;
font-size: 30px;
}
.search-btn {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
background: linear-gradient(90deg, #fa2c19 0%, #ff5d45 100%);
color: #ffffff;
font-size: 24px;
font-weight: bold;
padding: 12px 30px;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(250, 44, 25, 0.2);
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
}
/* Main Content */
.main-content {
padding: 0 20px 180px;
}
/* Banner Hero */
.banner-hero {
position: relative;
border-radius: 20px;
overflow: hidden;
background: linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%);
height: 280px;
margin-top: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.banner-decoration {
position: absolute;
border-radius: 50%;
opacity: 0.1;
}
.banner-decoration-top {
top: -80px;
right: -80px;
width: 240px;
height: 240px;
background-color: rgba(255, 255, 255, 0.3);
}
.banner-decoration-bottom {
bottom: -60px;
left: -60px;
width: 180px;
height: 180px;
background-color: rgba(147, 197, 253, 0.3);
}
.banner-inner {
position: relative;
// height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: 30px;
}
.banner-title {
font-size: 60px;
font-weight: 900;
color: #ffffff;
letter-spacing: 4px;
font-style: italic;
margin-bottom: 8px;
}
.banner-title-yellow {
color: #fde047;
}
.banner-subtitle-wrapper {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 30px;
opacity: 0.95;
}
.banner-divider {
width: 60px;
height: 1px;
background-color: rgba(255, 255, 255, 0.5);
}
.banner-subtitle {
color: #ffffff;
font-size: 22px;
font-weight: 500;
letter-spacing: 2px;
}
.banner-buttons {
display: flex;
width: 100%;
max-width: 600px;
gap: 20px;
}
.banner-btn {
flex: 1;
border-radius: 50px;
padding: 15px 0;
font-size: 26px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
pointer-events: none;
transform: scale(0.9);
}
.banner-btn-primary {
background-color: rgba(255, 255, 255, 0.1);
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
}
.banner-btn-secondary {
background-color: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
}
.banner-btn-icon {
font-size: 36px;
opacity: 0.8;
}
/* Navigation Grid */
.nav-grid-wrapper {
background-color: #ffffff;
border-radius: 20px;
padding: 30px;
margin-top: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.nav-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
.nav-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
.nav-icon-wrapper {
width: 88px;
height: 88px;
border-radius: 50%;
background-color: #f9fafb;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.nav-icon {
width: 60px;
height: 60px;
}
.nav-label {
font-size: 22px;
font-weight: 500;
color: #374151;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Featured Section */
.featured-section {
display: flex;
gap: 20px;
height: 280px;
margin-top: 20px;
}
.featured-card {
background-color: #ffffff;
border-radius: 20px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
position: relative;
}
.featured-card-left {
flex: 1.2;
background: linear-gradient(135deg, #fff7ed 0%, #ffffff 100%);
border: 1px solid #fed7aa;
padding: 20px;
display: flex;
flex-direction: column;
}
.featured-content {
position: relative;
z-index: 10;
}
.featured-title {
font-size: 30px;
font-weight: bold;
color: #1f2937;
}
.featured-desc {
font-size: 20px;
color: #f97316;
margin-top: 4px;
}
.featured-btn {
margin-top: 20px;
background: linear-gradient(90deg, #f97316 0%, #ef4444 100%);
color: #ffffff;
font-size: 22px;
font-weight: bold;
padding: 10px 20px;
border-radius: 50px;
border: none;
display: inline-block;
line-height: 1.5;
box-shadow: 0 2px 4px rgba(249, 115, 22, 0.3);
}
.featured-bg {
position: absolute;
bottom: 0;
right: 0;
opacity: 0.1;
pointer-events: none;
}
.featured-svg {
width: 180px;
height: 180px;
color: #ea580c;
transform: rotate(-12deg) translate(30px, 30px);
}
.featured-card-right {
flex: 1;
border: 1px solid #e5e7eb;
display: flex;
flex-direction: column;
}
.featured-image {
height: 67%;
position: relative;
}
.featured-img {
width: 100%;
height: 100%;
}
.featured-overlay {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(
180deg,
transparent 0%,
rgba(0, 0, 0, 0.6) 100%
);
padding: 10px 15px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.featured-overlay-title {
color: #ffffff;
font-weight: bold;
font-size: 26px;
}
.featured-footer {
height: 33%;
padding: 0 15px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #ffffff;
}
.featured-footer-left {
display: flex;
flex-direction: column;
}
.featured-footer-title {
font-size: 22px;
font-weight: bold;
color: #1f2937;
}
.featured-footer-arrow {
width: 44px;
height: 44px;
border-radius: 50%;
background-color: #eff6ff;
color: #3b82f6;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
}
/* Store Section */
.store-section {
padding-bottom: 20px;
margin-top: 20px;
}
.store-header {
font-size: 30px;
font-weight: bold;
color: #1f2937;
padding: 0 8px 15px;
display: flex;
align-items: center;
}
.store-header-line {
width: 6px;
height: 30px;
background-color: #fa2c19;
border-radius: 50px;
margin-right: 15px;
}
.store-list {
display: flex;
flex-direction: column;
gap: 20px;
}
.store-item {
background-color: #ffffff;
border-radius: 20px;
padding: 15px;
display: flex;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
border: 1px solid #f9fafb;
}
.store-image-wrapper {
width: 180px;
height: 180px;
flex-shrink: 0;
background-color: #f3f4f6;
border-radius: 16px;
overflow: hidden;
position: relative;
}
.store-image {
width: 100%;
height: 100%;
}
.store-badge {
position: absolute;
top: 0;
left: 0;
background-color: #eab308;
color: #ffffff;
font-size: 20px;
padding: 4px 12px;
border-bottom-right-radius: 16px;
font-weight: bold;
}
.store-info {
margin-left: 20px;
flex: 1;
display: flex;
flex-direction: column;
height: 180px;
justify-content: space-between;
padding: 8px 0;
}
.store-name {
font-weight: bold;
color: #1f2937;
font-size: 30px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 1.2;
}
.store-rating {
display: flex;
align-items: center;
font-size: 22px;
margin-top: 4px;
}
.rating-stars {
display: flex;
align-items: center;
margin-right: 15px;
}
.stars-text {
color: #fbbf24;
font-size: 20px;
margin-right: 8px;
}
.rating-score {
color: #fa2c19;
font-weight: bold;
}
.rating-divider {
color: #d1d5db;
margin: 0 10px;
}
.rating-sales {
color: #6b7280;
}
.store-distance {
display: flex;
align-items: center;
justify-content: space-between;
}
.distance-placeholder {
font-size: 22px;
color: transparent;
user-select: none;
}
.distance-text {
font-size: 22px;
color: #9ca3af;
}
.store-empty {
text-align: center;
padding: 80px 0;
color: #9ca3af;
font-size: 26px;
}
.iconfont {
font-size: inherit;
}
} /* .home-new 作用域结束 */
</style>

View File

@@ -0,0 +1,366 @@
<template>
<view class="home-old">
<view :style="{ marginTop: BarHeight + 'px' }"></view>
<view class="local">
<view class="iconfont icon-dizhi" style="font-size: 20px"></view>
<text class="text-[28px]">{{ address }}</text>
</view>
<view class="search">
<view
class="iconfont icon-sousuo"
style="color: #8f8f8f; margin-right: 8px"></view>
<input placeholder="请输入商家名称搜索" v-model="searchVal" />
<view class="search-btn" @click="clickSearch">搜索</view>
</view>
<view class="banner">
<!-- <view
class="title"
:style="{
backgroundImage: `url('${titleImgPath}')`,
}"></view> -->
<image class="title" :src="titleImgPath"></image>
<view class="jf-btn" hover-class="none"></view>
<!-- <view class="footer">
<navigator
hover-class="none"
class="btn-1"
url="/pages/fastBuy/index?type=1"></navigator>
<navigator
hover-class="none"
openType="switchTab"
url="/pages/game/gamehome/index"
class="btn-2"></navigator>
<navigator
hover-class="none"
class="btn-3"
url="/pages/fastBuy/index?type=2"></navigator>
</view> -->
</view>
<view class="navigation">
<view
class="item"
v-for="(item, index) in navigationList"
:key="index"
@click="toPage(item)">
<image class="icon" :src="item.icon" />
<view class="text">{{ item.name }}</view>
</view>
</view>
<!-- <navigator
class="ad"
url="/pages/marketing/yq/index"
open-type="navigate"
hover-class="none">
</navigator> -->
<MerList :get-user-location="getUserLocal" />
<Popup :imgArr="imgList" />
</view>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
import { ref } from 'vue';
import { getHomeList } from '@/api/home';
import { bindParent } from '@/api/user';
import MerList from '@/components/MerList.vue';
import Popup from '@/components/Popup.vue';
const statusBarHeight = Taro.getSystemInfoSync().statusBarHeight;
const BarHeight = ref((statusBarHeight as number) + 7);
const titleImgPath = require(process.env.TARO_APP_TITLE_IMG as string);
interface navigationType {
ID?: number;
type: number;
icon: string;
name: string;
url: string;
}
const navigationList = ref<Array<navigationType>>([]);
const imgList = ref([
// require('../../static/popTip-1.png'),
// require('../../static/popTip.png'),
require('../../../static/zhenggai.png'),
]);
Taro.useShareAppMessage(() => ({
title: '捷兑通',
path: `/pages/index/index?scene=${Taro.getStorageSync('token')}`,
imageUrl: 'https://upload.jdt168.com/1714375021923881119_Share.jpg',
}));
const searchVal = ref('');
const clickSearch = () => {
if (!searchVal.value)
return Taro.showToast({
title: '请输入商家名称再搜索',
icon: 'none',
});
Taro.navigateTo({
url: `/pages/search/index?name=${searchVal.value}`,
});
searchVal.value = '';
};
Taro.useLoad(() => {
Taro.getPrivacySetting({
success: res => {
if (res.needAuthorization) {
Taro.requirePrivacyAuthorize({
success: () => {
console.log('用户同意授权');
},
fail: () => {
console.log('用户拒绝授权');
Taro.exitMiniProgram();
},
});
}
},
});
getNavLists();
getUserLocal();
checkBindParent();
});
const checkBindParent = async () => {
if (Taro.getStorageSync('token') && Taro.getStorageSync('bind_id')) {
try {
const res: any = await bindParent({
uid: Taro.getStorageSync('bind_id'),
});
Taro.showToast({
title: res.msg,
});
Taro.removeStorageSync('bind_id');
} catch (error) {
Taro.removeStorageSync('bind_id');
}
}
};
const address = ref('获取位置中......');
const getUserLocal = async () => {
Taro.getLocation({
type: 'wgs84',
success: res => {
// Taro.request({
// url: `https://apis.map.qq.com/ws/geocoder/v1/?location=${res.latitude},${res.longitude}&key=4EJBZ-TZXCV-IHUPX-UMI2L-MK3N3-37FSQ&get_poi=1`,
// method: 'GET',
// success: res => {
// switch (res.data.status) {
// case 121:
// Taro.showToast({
// title: res.data.message,
// icon: 'none',
// });
// break;
// default:
// const data = res.data.result.address_component;
// address.value = `${data.district}${data.street_number}`;
// break;
// }
// },
// });
Taro.request({
url: `https://api.tianditu.gov.cn/geocoder?postStr={'lon':${res.longitude},'lat':${res.latitude},'ver':1}&type=geocode&tk=42db4f3dfd1a18d31e73ee90aa2ce054`,
method: 'GET',
success: res => {
const { msg, result } = res.data;
if (msg === 'ok') {
address.value = `${result.addressComponent.county}${result.addressComponent.town}${result.addressComponent.address}`;
} else {
Taro.showToast({
title: msg,
icon: 'none',
});
}
},
});
},
});
};
const getNavLists = async () => {
navigationList.value = [
// {
// type: 1,
// icon: '//p0.meituan.net/csc/5c770748f0028c63741c5ec14df3cc386715.png',
// url: '',
// name: '活动商家',
// },
// {
// type: 1,
// icon: '//p0.meituan.net/csc/4868c06b99008ff7d5f81e6514858c8a7950.png',
// url: '',
// name: '兑换商家',
// },
{
type: 1,
icon: '//p0.meituan.net/csc/f33ad2443a67e9f3474a1d5fd9d529db7504.png',
url: '/pages/users/settled_mer/index',
name: '商户入驻',
},
{
type: 1,
icon: '//p0.meituan.net/csc/0403cf37dd14a6b44b22ffccaa2878f95703.png',
url: '/pages/allClassList/index',
name: '全部服务',
},
];
const res = await getHomeList();
res.data.data.forEach(item => {
navigationList.value.unshift({
ID: item.ID,
type: 2,
icon: item.icon,
url: item.url,
name: item.name,
});
});
};
const toPage = item => {
item.type !== 1
? Taro.navigateTo({
url: `/pages/search/index?id=${item.ID}&name=${item.name}`,
})
: Taro.navigateTo({
url: item.url as string,
});
};
</script>
<style lang="scss">
/* 旧版样式 - 所有样式包裹在 .home-old 作用域下 */
page {
background-image: url('//p0.meituan.net/csc/aaaccd28594119e4b838d07d30739471440261.png');
background-size: 100% 57%;
background-repeat: no-repeat;
box-sizing: border-box;
min-height: 100vh;
}
.home-old {
.local {
margin-left: 15px;
display: flex;
align-items: flex-end;
color: #fff;
}
.search {
margin: 30px auto;
display: flex;
border-radius: 18px;
justify-content: space-between;
align-items: center;
padding: 10px 15px;
background: rgba(255, 255, 255, 0.8);
width: 730px;
input {
flex: 1;
}
.search-btn {
background-color: #f83d3d;
color: #fff;
border-radius: 10px;
width: 100px;
height: 60px;
text-align: center;
line-height: 60px;
}
}
.banner {
position: relative;
text-align: center;
.title {
width: 600px;
height: 90px;
left: 50%;
}
.jf-btn {
margin: 15px auto;
background-image: url('//p1.meituan.net/csc/e125184432dc591137c24a26abe5796a25262.png');
background-size: 100% 100%;
width: 350px;
height: 70px;
}
.footer {
display: flex;
align-items: flex-end;
justify-content: space-between;
margin: 0 auto;
padding: 0 15px;
.btn-1 {
background-image: url('//p0.meituan.net/csc/7708348ee250eae910328bb7c12197f029562.png');
background-size: 100% 100%;
width: 200px;
height: 220px;
}
.btn-2 {
// background-image: url('//p1.meituan.net/csc/8cc2b518031eb7424b184d90a583d805146287.png');
background-image: url('../../../static/game_banner.png');
background-size: 100% 100%;
width: 300px;
height: 220px;
}
.btn-3 {
background-image: url('//p0.meituan.net/csc/31bd1f5c791c95557758dfa5c96e001529545.png');
background-size: 100% 100%;
width: 200px;
height: 220px;
}
}
}
.navigation {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 40px;
margin: 20px;
height: auto;
background-color: #fff;
border-radius: 20px;
padding: 32px 0;
.item {
display: flex;
flex-direction: column;
align-items: center;
.icon {
background-size: 100% 100%;
width: 90px;
height: 90px;
}
.text {
color: #333333;
font-size: 26px;
margin-top: 6px;
}
}
}
.ad {
// background-image: url('https://jdt168.oss-cn-guangzhou.aliyuncs.com/ad.png');
background-image: url('https://pic.imgdb.cn/item/6697aa0dd9c307b7e95c94d9.png');
background-size: 100% 100%;
height: 180px;
margin: 20px;
}
}
</style>

View File

@@ -1,123 +0,0 @@
page {
background-image: url('//p0.meituan.net/csc/aaaccd28594119e4b838d07d30739471440261.png');
background-size: 100% 57%;
background-repeat: no-repeat;
box-sizing: border-box;
}
.local {
margin-left: 15px;
display: flex;
align-items: flex-end;
color: #fff;
}
.search {
margin: 30px auto;
display: flex;
border-radius: 18px;
justify-content: space-between;
align-items: center;
padding: 10px 15px;
background: rgba(255, 255, 255, 0.8);
width: 730px;
input {
flex: 1;
}
.search-btn {
background-color: #f83d3d;
color: #fff;
border-radius: 10px;
width: 100px;
height: 60px;
text-align: center;
line-height: 60px;
}
}
.banner {
.title {
background-image: url('//p0.meituan.net/csc/542112fc072d4687b437848bc29b0a1730495.png');
background-size: 100% 100%;
width: 600px;
height: 90px;
margin: auto;
}
.jf-btn {
margin: 15px auto;
background-image: url('//p1.meituan.net/csc/e125184432dc591137c24a26abe5796a25262.png');
background-size: 100% 100%;
width: 350px;
height: 70px;
}
.footer {
display: flex;
align-items: flex-end;
justify-content: space-between;
margin: 0 auto;
padding: 0 15px;
.btn-1 {
background-image: url('//p0.meituan.net/csc/7708348ee250eae910328bb7c12197f029562.png');
background-size: 100% 100%;
width: 200px;
height: 220px;
}
.btn-2 {
// background-image: url('//p1.meituan.net/csc/8cc2b518031eb7424b184d90a583d805146287.png');
background-image: url('../../static/game_banner.png');
background-size: 100% 100%;
width: 300px;
height: 220px;
}
.btn-3 {
background-image: url('//p0.meituan.net/csc/31bd1f5c791c95557758dfa5c96e001529545.png');
background-size: 100% 100%;
width: 200px;
height: 220px;
}
}
}
.navigation {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 40px;
margin: 20px;
height: auto;
background-color: #fff;
border-radius: 20px;
padding: 32px 0;
.item {
display: flex;
flex-direction: column;
align-items: center;
.icon {
background-size: 100% 100%;
width: 90px;
height: 90px;
}
.text {
color: #333333;
font-size: 26px;
margin-top: 6px;
}
}
}
.ad {
// background-image: url('https://jdt168.oss-cn-guangzhou.aliyuncs.com/ad.png');
background-image: url('https://pic.imgdb.cn/item/6697aa0dd9c307b7e95c94d9.png');
background-size: 100% 100%;
height: 180px;
margin: 20px;
}

View File

@@ -1,187 +1,14 @@
<template> <template>
<view> <HomeNew v-if="isNewHome" />
<view :style="{marginTop: BarHeight + 'px'}"></view> <HomeOld v-else />
<view class="local">
<view class="iconfont icon-dizhi" style="font-size: 20px"></view>
<text class="text-[28px]">{{ address }}</text>
</view>
<view class="search">
<view
class="iconfont icon-sousuo"
style="color: #8f8f8f; margin-right: 8px"></view>
<input placeholder="请输入商家名称搜索" v-model="searchVal" />
<view class="search-btn" @click="clickSearch">搜索</view>
</view>
<view class="banner">
<view class="title"></view>
<navigator class="jf-btn" hover-class="none"></navigator>
<view class="footer">
<navigator
hover-class="none"
class="btn-1"
url="/pages/fastBuy/index?type=1"></navigator>
<navigator
hover-class="none"
openType="switchTab"
url="/pages/game/gamehome/index"
class="btn-2"></navigator>
<navigator
hover-class="none"
class="btn-3"
url="/pages/fastBuy/index?type=2"></navigator>
</view>
</view>
<view class="navigation">
<view
class="item"
v-for="(item, index) in navigationList"
:key="index"
@click="toPage(item)">
<image class="icon" :src="item.icon" />
<view class="text">{{ item.name }}</view>
</view>
</view>
<navigator
class="ad"
url="/pages/marketing/yq/index"
open-type="navigate"
hover-class="none">
</navigator>
<MerList :get-user-location="getUserLocal" />
<Popup :imgArr="imgList" />
</view>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import { ref } from 'vue';
import {ref} from 'vue'; import HomeOld from './components/HomeOld.vue';
import {getHomeList} from '@/api/home'; import HomeNew from './components/HomeNew.vue';
import MerList from '@/components/MerList.vue';
import Popup from '@/components/Popup.vue';
const statusBarHeight = Taro.getSystemInfoSync().statusBarHeight; const isNewHome = process.env.TARO_APP_SHOW_NEW_HOME === 'yes';
const BarHeight = ref((statusBarHeight as number) + 7);
interface navigationType {
ID?: number;
type: number;
icon: string;
name: string;
url: string;
}
const navigationList = ref<Array<navigationType>>([]);
const imgList = ref([require('../../static/popTip.png')]);
Taro.useShareAppMessage(() => ({
title: '捷兑通',
path: `/pages/index/index?scene=${Taro.getStorageSync('token')}`,
imageUrl: 'https://upload.jdt168.com/1714375021923881119_Share.jpg',
}));
const searchVal = ref('');
const clickSearch = () => {
if (!searchVal.value)
return Taro.showToast({
title: '请输入商家名称再搜索',
icon: 'none',
});
Taro.navigateTo({
url: `/pages/search/index?name=${searchVal.value}`,
});
searchVal.value = '';
};
Taro.useLoad(() => {
Taro.getPrivacySetting({
success: res => {
if (res.needAuthorization) {
Taro.requirePrivacyAuthorize({
success: () => {
console.log('用户同意授权');
},
fail: () => {
console.log('用户拒绝授权');
Taro.exitMiniProgram();
},
});
}
},
});
getNavLists();
getUserLocal();
});
const address = ref('获取位置中......');
const getUserLocal = async () => {
Taro.getLocation({
type: 'wgs84',
success: res => {
Taro.request({
url: `https://apis.map.qq.com/ws/geocoder/v1/?location=${res.latitude},${res.longitude}&key=S3GBZ-WR26O-IXNW2-SXBOD-LZXV6-WAFNO&get_poi=1`,
method: 'GET',
success: res => {
const data = res.data.result.address_component;
address.value = `${data.district}${data.street_number}`;
},
});
},
});
};
const getNavLists = async () => {
navigationList.value = [
// {
// type: 1,
// icon: '//p0.meituan.net/csc/5c770748f0028c63741c5ec14df3cc386715.png',
// url: '',
// name: '活动商家',
// },
// {
// type: 1,
// icon: '//p0.meituan.net/csc/4868c06b99008ff7d5f81e6514858c8a7950.png',
// url: '',
// name: '兑换商家',
// },
{
type: 1,
icon: '//p0.meituan.net/csc/f33ad2443a67e9f3474a1d5fd9d529db7504.png',
url: '/pages/users/settled_mer/index',
name: '商户入驻',
},
{
type: 1,
icon: '//p0.meituan.net/csc/0403cf37dd14a6b44b22ffccaa2878f95703.png',
url: '/pages/allClassList/index',
name: '全部服务',
},
];
const res = await getHomeList();
res.data.data.forEach(item => {
navigationList.value.unshift({
ID: item.ID,
type: 2,
icon: item.icon,
url: item.url,
name: item.name,
});
});
};
const toPage = item => {
item.type !== 1
? Taro.navigateTo({
url: `/pages/search/index?id=${item.ID}&name=${item.name}`,
})
: Taro.navigateTo({
url: item.url as string,
});
};
</script> </script>
<style lang="scss"> <style lang="scss" scoped></style>
@import './index.scss';
</style>

View File

@@ -41,9 +41,9 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {ref} from 'vue'; import { ref } from 'vue';
import {getPhone, login} from '@/api/user'; import { getPhone, login } from '@/api/user';
import {getQrCode, bindQrCode} from '@/api/code'; import { getQrCode, bindQrCode } from '@/api/code';
import './index.scss'; import './index.scss';
const status = ref(0); const status = ref(0);
@@ -104,7 +104,7 @@ const getPhoneNumber = async (e: any) => {
title: '授权手机号中', title: '授权手机号中',
mask: true, mask: true,
}); });
const {code} = e.detail; const { code } = e.detail;
const res = await getPhone({ const res = await getPhone({
code: code, code: code,
}); });

View File

@@ -52,13 +52,13 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getHdOrJfGoods, createActiveOrder} from '@/api/goods'; import { getHdOrJfGoods, createActiveOrder } from '@/api/goods';
import {getUserPoint} from '@/api/admin'; import { getUserPoint } from '@/api/admin';
import {addCart} from '@/api/cart'; import { addCart } from '@/api/cart';
import Back from '@/components/Back.vue'; import Back from '@/components/Back.vue';
import {RectRight} from '@nutui/icons-vue-taro'; import { RectRight } from '@nutui/icons-vue-taro';
import './index.scss'; import './index.scss';
const data = ref<any[]>([]); const data = ref<any[]>([]);

View File

@@ -1,6 +1,6 @@
<template> <template>
<view> <view>
<view class="head-wrapper" :style="{top: BarHeight + 'px'}"> <view class="head-wrapper" :style="{ top: BarHeight + 'px' }">
<view class="head-menu"> <view class="head-menu">
<Left class="iconfont" @click="returns" /> <Left class="iconfont" @click="returns" />
<Home class="iconfont" @click="goHome" /> <Home class="iconfont" @click="goHome" />
@@ -27,7 +27,7 @@
spacing="1" spacing="1"
active-color="rgba(252, 207, 10, 1)" active-color="rgba(252, 207, 10, 1)"
v-model="mer_info.rate" /> v-model="mer_info.rate" />
<view class="text-[#9E9E9E] text-[25px]">销量10000</view> <view class="text-[#9E9E9E] text-[25px]">销量1000+</view>
<view class="text-[#9E9E9E] text-[25px]" <view class="text-[#9E9E9E] text-[25px]"
>营业时间{{ mer_info.week_start }}-{{ mer_info.week_end }} >营业时间{{ mer_info.week_start }}-{{ mer_info.week_end }}
</view> </view>
@@ -54,12 +54,12 @@
<view @click="clickMap"> <view @click="clickMap">
<image <image
class="w-[50px] h-[50px]" class="w-[50px] h-[50px]"
src="http://p1.meituan.net/csc/92ee8512c90527169b44e07fd11d250d924.png" /> src="https://p1.meituan.net/csc/92ee8512c90527169b44e07fd11d250d924.png" />
</view> </view>
<view @click="clickPhone"> <view @click="clickPhone">
<image <image
class="w-[50px] h-[50px]" class="w-[50px] h-[50px]"
src="http://p0.meituan.net/csc/ab0493b124a6bb858bf82a2340767c0d919.png" /> src="https://p0.meituan.net/csc/ab0493b124a6bb858bf82a2340767c0d919.png" />
</view> </view>
</view> </view>
</view> </view>
@@ -134,10 +134,10 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {Left, Home, Plus, Minus} from '@nutui/icons-vue-taro'; import { Left, Home, Plus, Minus } from '@nutui/icons-vue-taro';
import {Ref, ref} from 'vue'; import { Ref, ref } from 'vue';
import {calculateDistance} from '@/utils'; import { calculateDistance } from '@/utils';
import {getGoodList, getMerCategory, getMerDetail} from '@/api/goods'; import { getGoodList, getMerCategory, getMerDetail } from '@/api/goods';
import Cart from '@/components/Cart.vue'; import Cart from '@/components/Cart.vue';
const statusBarHeight = Taro.getSystemInfoSync()?.statusBarHeight; const statusBarHeight = Taro.getSystemInfoSync()?.statusBarHeight;
@@ -161,12 +161,12 @@ Taro.useLoad(opt => {
}); });
Taro.useDidShow(() => { Taro.useDidShow(() => {
if (!Taro.getStorageSync('token')) { // if (!Taro.getStorageSync('token')) {
Taro.navigateTo({ // Taro.navigateTo({
url: '/pages/users/login/index?isBack=1', // url: '/pages/users/login/index?isBack=1',
}); // });
return; // return;
} // }
Taro.getLocation({ Taro.getLocation({
type: 'wgs84', type: 'wgs84',
success: res => { success: res => {

View File

@@ -1,9 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {Ref, ref} from 'vue'; import { Ref, ref } from 'vue';
import Upload from '../../../components/Upload.vue'; import Upload from '../../../components/Upload.vue';
import RichEditor from '../../../components/RichEditor.vue'; import RichEditor from '../../../components/RichEditor.vue';
import {addGood} from '@/api/product'; import { addGood } from '@/api/product';
const ruleForm = ref(null) as Ref; const ruleForm = ref(null) as Ref;
@@ -90,7 +90,7 @@ const confirmClass = (val: any) => {
}; };
const ok = async () => { const ok = async () => {
ruleForm.value.validate().then(({valid, errors}: any) => { ruleForm.value.validate().then(({ valid, errors }: any) => {
if (valid) { if (valid) {
console.log('success', basicData.value); console.log('success', basicData.value);
} else { } else {

View File

@@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import {ref} from 'vue'; import { ref } from 'vue';
import {productList} from '@/api/product'; import { productList } from '@/api/product';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
const swiperCur = ref(0); const swiperCur = ref(0);
@@ -69,7 +69,7 @@ const changeState = (item: List) => {
next-margin="0" next-margin="0"
:current="swiperCur" :current="swiperCur"
@change="swiperChange"> @change="swiperChange">
<swiper-item :class="{active: 0 == swiperCur}"> <swiper-item :class="{ active: 0 == swiperCur }">
<view class="slide-navigator"> <view class="slide-navigator">
<view class="item" @click="jumpAddGoods(null, 1)"> <view class="item" @click="jumpAddGoods(null, 1)">
<image <image
@@ -120,7 +120,7 @@ const changeState = (item: List) => {
</navigator> </navigator>
</view> </view>
</swiper-item> </swiper-item>
<swiper-item :class="{active: 1 == swiperCur}"> <swiper-item :class="{ active: 1 == swiperCur }">
<view class="slide-navigator"> <view class="slide-navigator">
<navigator <navigator
class="item" class="item"

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import {ref, onMounted} from 'vue'; import { ref, onMounted } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import MerList from '@/components/MerList.vue'; import MerList from '@/components/MerList.vue';
import Storelist from '@/components/StoreList.vue'; import Storelist from '@/components/StoreList.vue';
@@ -25,10 +25,16 @@ onMounted(() => {
</script> </script>
<template> <template>
<view> <view class="search-page">
<MerList v-if="classId" v-model="classId" /> <MerList v-if="classId" v-model="classId" />
<Storelist v-else v-model="name" /> <Storelist v-else v-model="name" />
</view> </view>
</template> </template>
<style lang="scss"></style> <style lang="scss">
.search-page {
min-height: 100vh;
background-color: #f5f6f7;
background-image: none;
}
</style>

View File

@@ -1,8 +1,8 @@
.appUser { .appUser {
box-sizing: border-box; box-sizing: border-box;
background-color: #f8f8f8; // background-color: #f8f8f8;
height: 100%; height: 100%;
background-image: url('http://p0.meituan.net/csc/f44bb11463e3c538c307d7ce4b303bec33520.png'); background-image: url('https://p0.meituan.net/csc/f44bb11463e3c538c307d7ce4b303bec33520.png');
background-size: 100% 500px; background-size: 100% 500px;
background-repeat: no-repeat; background-repeat: no-repeat;
position: relative; position: relative;
@@ -103,7 +103,7 @@
} }
.user-acc { .user-acc {
background-image: url('http://p0.meituan.net/csc/a74c44a7af541f01efbcc6fb023e6e09132712.png'); background-image: url('https://p0.meituan.net/csc/a74c44a7af541f01efbcc6fb023e6e09132712.png');
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
width: 90%; width: 90%;

View File

@@ -1,14 +1,14 @@
<template> <template>
<view class="appUser"> <view class="appUser">
<view <view
:style="{ width: isLogin ? '100%' : '70%' }"
class="user-center-card__header__transparent" class="user-center-card__header__transparent"
v-if="isLogin" v-if="isLogin">
:style="{width: isLogin ? '100%' : '70%'}">
<view <view
class="user-center-card__header__avatar" class="user-center-card__header__avatar"
@click="toPage('/pages/users/user_setting/index')"> @click="toPage('/pages/users/user_setting/index')">
<nut-avatar size="large"> <nut-avatar size="large">
<img :src="userInfo.data?.avatarUrl" /> <img :src="userInfo.data?.avatarUrl" alt="" />
</nut-avatar> </nut-avatar>
</view> </view>
<view <view
@@ -34,7 +34,8 @@
<view class="user-center-card__header__avatar"> <view class="user-center-card__header__avatar">
<nut-avatar size="large"> <nut-avatar size="large">
<img <img
src="https://img12.360buyimg.com/imagetools/jfs/t1/196430/38/8105/14329/60c806a4Ed506298a/e6de9fb7b8490f38.png" /> src="https://img12.360buyimg.com/imagetools/jfs/t1/196430/38/8105/14329/60c806a4Ed506298a/e6de9fb7b8490f38.png"
alt="" />
</nut-avatar> </nut-avatar>
</view> </view>
<view class="user-center-card__header__info"> <view class="user-center-card__header__info">
@@ -72,7 +73,7 @@
class="mt-[30px] flex flex-col items-center" class="mt-[30px] flex flex-col items-center"
@click="toOrderList(1)"> @click="toOrderList(1)">
<IconFont <IconFont
name="http://p0.meituan.net/csc/9943f6c938fc0e310141a2b99d5bde6617483.png" name="https://p0.meituan.net/csc/9943f6c938fc0e310141a2b99d5bde6617483.png"
size="42" /> size="42" />
<view class="mt-[15px] text-[25px] text-[#333333]">待付款</view> <view class="mt-[15px] text-[25px] text-[#333333]">待付款</view>
</view> </view>
@@ -80,7 +81,7 @@
class="mt-[30px] flex flex-col items-center" class="mt-[30px] flex flex-col items-center"
@click="toOrderList(2)"> @click="toOrderList(2)">
<IconFont <IconFont
name="http://p0.meituan.net/csc/5306d094d7b4b61848dd21c86b693a9515523.png" name="https://p0.meituan.net/csc/5306d094d7b4b61848dd21c86b693a9515523.png"
size="42" /> size="42" />
<view class="mt-[15px] text-[25px] text-[#333333]">待使用</view> <view class="mt-[15px] text-[25px] text-[#333333]">待使用</view>
</view> </view>
@@ -88,7 +89,7 @@
class="mt-[30px] flex flex-col items-center" class="mt-[30px] flex flex-col items-center"
@click="toOrderList(3)"> @click="toOrderList(3)">
<IconFont <IconFont
name="http://p0.meituan.net/csc/32ea9bbf51e3bbb0cbd75bc0fea97ca815779.png" name="https://p0.meituan.net/csc/32ea9bbf51e3bbb0cbd75bc0fea97ca815779.png"
size="42" /> size="42" />
<view class="mt-[15px] text-[25px] text-[#333333]">已使用</view> <view class="mt-[15px] text-[25px] text-[#333333]">已使用</view>
</view> </view>
@@ -96,7 +97,7 @@
class="mt-[30px] flex flex-col items-center" class="mt-[30px] flex flex-col items-center"
@click="toOrderList(4)"> @click="toOrderList(4)">
<IconFont <IconFont
name="http://p0.meituan.net/csc/2e0dee89e9a3e3f2e7bf65db355fa11c11630.png" name="https://p0.meituan.net/csc/2e0dee89e9a3e3f2e7bf65db355fa11c11630.png"
size="42" /> size="42" />
<view class="mt-[15px] text-[25px] text-[#333333]">已失效</view> <view class="mt-[15px] text-[25px] text-[#333333]">已失效</view>
</view> </view>
@@ -135,7 +136,7 @@
@click="toPage('/pages/admin/add_order/index')"> @click="toPage('/pages/admin/add_order/index')">
<IconFont <IconFont
size="42" size="42"
name="http://p0.meituan.net/csc/72a389ac6a441061fd534b96644c431b7839.png"></IconFont> name="https://p0.meituan.net/csc/72a389ac6a441061fd534b96644c431b7839.png"></IconFont>
<view class="label">后结点单</view> <view class="label">后结点单</view>
</view> </view>
<view <view
@@ -144,7 +145,7 @@
@click="toPage('/pages/admin/verify/index')"> @click="toPage('/pages/admin/verify/index')">
<IconFont <IconFont
size="42" size="42"
name="http://p1.meituan.net/csc/c236a8b7a73178da25218e1fb59a96f06610.png"></IconFont> name="https://p1.meituan.net/csc/c236a8b7a73178da25218e1fb59a96f06610.png"></IconFont>
<view class="label">订单核销</view> <view class="label">订单核销</view>
</view> </view>
<view <view
@@ -153,7 +154,7 @@
@click="toPage('/pages/admin/order_manage/index')"> @click="toPage('/pages/admin/order_manage/index')">
<IconFont <IconFont
size="42" size="42"
name="http://p0.meituan.net/csc/bd9aca457a109b4d69a692a9109a73ed9045.png"></IconFont> name="https://p0.meituan.net/csc/bd9aca457a109b4d69a692a9109a73ed9045.png"></IconFont>
<view class="label">订单管理</view> <view class="label">订单管理</view>
</view> </view>
<view <view
@@ -162,16 +163,16 @@
@click="toPage('/pages/admin/withdrawal/index')"> @click="toPage('/pages/admin/withdrawal/index')">
<IconFont <IconFont
size="42" size="42"
name="http://p0.meituan.net/csc/f85d7dc1bf9eda8977e9089b260a586b7440.png"></IconFont> name="https://p0.meituan.net/csc/f85d7dc1bf9eda8977e9089b260a586b7440.png"></IconFont>
<view class="label">余额提现</view> <view class="label">余额提现</view>
</view> </view>
</view> </view>
</view> </view>
<!-- 版权 --> <!-- 版权 -->
<view class="text-[#999999] mt-5 text-[20px] text-center"> <view class="mt-5 text-[20px] text-center">
<view>鑫瓴科技版权所有</view> <view class="text-[#999999]">{{ copText }}</view>
<view>v4.0.0</view> <!-- <view>v4.0.0</view> -->
</view> </view>
<!-- 登录 --> <!-- 登录 -->
<Auth <Auth
@@ -182,17 +183,23 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {ref} from 'vue'; import { ref } from 'vue';
import {ArrowRight, IconFont} from '@nutui/icons-vue-taro'; import { ArrowRight, IconFont } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import Auth from '@/components/Auth.vue'; import Auth from '@/components/Auth.vue';
import {getPersonalInfo, getPhone, bindParent} from '@/api/user'; import {
import {maskString} from '@/utils'; getPersonalInfo,
getPhone,
// bindParent
} from '@/api/user';
import { maskString } from '@/utils';
const isShowLogin = ref(false); const isShowLogin = ref(false);
const isLogin = ref(false); const isLogin = ref(false);
const copText = process.env.TARO_APP_COP;
interface UserInfo { interface UserInfo {
data?: { data?: {
nickName?: string; nickName?: string;
@@ -231,15 +238,15 @@ const init_data = () => {
} }
}; };
const test = () => { // const test = () => {
console.log(process.env.TARO_APP_ID); // console.log(process.env.TARO_APP_ID);
Taro.openCustomerServiceChat({ // Taro.openCustomerServiceChat({
corpId: 'wwb5dd953ca36043ef', // corpId: 'wwb5dd953ca36043ef',
extInfo: { // extInfo: {
url: 'https://work.weixin.qq.com/kfid/kfcb2b0420e94102346', // url: 'https://work.weixin.qq.com/kfid/kfcb2b0420e94102346',
}, // },
}); // });
}; // };
const cancelLogin = () => { const cancelLogin = () => {
isShowLogin.value = false; isShowLogin.value = false;
@@ -284,39 +291,39 @@ const userMenuList = ref([
{ {
label: '账户明细', label: '账户明细',
url: '/pages/users/account/index', url: '/pages/users/account/index',
icon: 'http://p0.meituan.net/csc/104f787b7cc5582868be46ff52475ecf7084.png', icon: 'https://p0.meituan.net/csc/104f787b7cc5582868be46ff52475ecf7084.png',
}, },
{ {
label: '后结订单', label: '后结订单',
url: '/pages/users/pending_order/index', url: '/pages/users/pending_order/index',
icon: 'http://p0.meituan.net/csc/68d3f1f1ea375897a2b918851199b6546322.png', icon: 'https://p0.meituan.net/csc/68d3f1f1ea375897a2b918851199b6546322.png',
}, },
{ {
label: '我的推广', label: '我的推广',
url: '/pages/users/distribution/index', url: '/pages/users/distribution/index',
icon: 'http://p0.meituan.net/csc/950814cc0ed1289f170e8612fab597cd5310.png', icon: 'https://p0.meituan.net/csc/950814cc0ed1289f170e8612fab597cd5310.png',
}, },
{ {
label: '联系客服', label: '联系客服',
type: 333, type: 333,
url: '/pages/users/account/index', url: '/pages/users/account/index',
icon: 'http://p0.meituan.net/csc/ddd4b6ff4271ec05ced60db0aee1e9548383.png', icon: 'https://p0.meituan.net/csc/ddd4b6ff4271ec05ced60db0aee1e9548383.png',
}, },
{ {
label: '设置', label: '设置',
url: '/pages/users/setting/index', url: '/pages/users/setting/index',
icon: 'http://p0.meituan.net/csc/1d8e6b328d384ff042c282976b82feec6005.png', icon: 'https://p0.meituan.net/csc/1d8e6b328d384ff042c282976b82feec6005.png',
}, },
{ {
label: '关于我们', label: '关于我们',
url: '', url: '',
icon: 'http://p0.meituan.net/csc/3e772eca05bd56104e8a0a5c6cffe56c7447.png', icon: 'https://p0.meituan.net/csc/3e772eca05bd56104e8a0a5c6cffe56c7447.png',
}, },
]); ]);
const clickLogin = () => { const clickLogin = () => {
// isShowLogin.value = true // isShowLogin.value = true
Taro.redirectTo({ Taro.navigateTo({
url: '/pages/users/login/index', url: '/pages/users/login/index',
}); });
}; };
@@ -327,28 +334,28 @@ const toPage = (url: string) => {
}); });
}; };
const scanCode = () => { // const scanCode = () => {
Taro.scanCode({ // Taro.scanCode({
onlyFromCamera: true, // onlyFromCamera: true,
scanType: ['qrCode'], // scanType: ['qrCode'],
success: async data => { // success: async data => {
try { // try {
await bindParent({ // await bindParent({
uid: data.result, // uid: data.result,
}); // });
Taro.showToast({ // Taro.showToast({
title: '绑定成功', // title: '绑定成功',
icon: 'none', // icon: 'none',
}); // });
} catch (error) { // } catch (error) {
Taro.showToast({ // Taro.showToast({
title: error.msg, // title: error.msg,
icon: 'none', // icon: 'none',
}); // });
} // }
}, // },
}); // });
}; // };
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@@ -1,9 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import {computed, ref} from 'vue'; import { computed, ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import * as dayjs from 'dayjs'; import * as dayjs from 'dayjs';
import {getIntegralDetail, getBeanDetail, getGiftRecord} from '@/api/user'; import { getIntegralDetail, getBeanDetail, getGiftRecord } from '@/api/user';
import {TriangleDown} from '@nutui/icons-vue-taro'; import { TriangleDown } from '@nutui/icons-vue-taro';
const tabValue = ref(1); const tabValue = ref(1);

View File

@@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {ref} from 'vue'; import { ref } from 'vue';
import {getVerifyCode, phoneLogin, getPersonalInfo} from '@/api/user'; import { getVerifyCode, phoneLogin, getPersonalInfo } from '@/api/user';
import logoImg from '../../../static/logo.jpg'; import logoImg from '../../../static/logo.jpg';
const optData = ref<any>({}); const optData = ref<any>({});

View File

@@ -14,7 +14,7 @@
<view style="width: 45%"></view> <view style="width: 45%"></view>
</view> </view>
<!-- 二维码弹窗 --> <!-- 二维码弹窗 -->
<nut-popup :style="{padding: '30px 50px'}" v-model:visible="show"> <nut-popup :style="{ padding: '30px 50px' }" v-model:visible="show">
<view class="popup"> <view class="popup">
<view>推荐人二维码绑定</view> <view>推荐人二维码绑定</view>
<image style="margin-top: 10px" :src="urlCode" /> <image style="margin-top: 10px" :src="urlCode" />
@@ -24,10 +24,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import {IconFont} from '@nutui/icons-vue-taro'; import { IconFont } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getRefereeCode} from '@/api/user'; import { getRefereeCode } from '@/api/user';
const show = ref(false); const show = ref(false);

View File

@@ -3,7 +3,7 @@
<view v-if="data.length > 0"> <view v-if="data.length > 0">
<view <view
class="card-list" class="card-list"
v-for="(item, index) in (data as any[])" v-for="(item, index) in data as any[]"
:key="index"> :key="index">
<view class="left"> <view class="left">
<view>昵称{{ item.nick_name }}</view> <view>昵称{{ item.nick_name }}</view>
@@ -29,9 +29,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {useLoad, showToast} from '@tarojs/taro'; import { useLoad, showToast } from '@tarojs/taro';
import {ref} from 'vue'; import { ref } from 'vue';
import {getTGIntegralDetail} from '../../../../api/user'; import { getTGIntegralDetail } from '../../../../api/user';
const data = ref([]); const data = ref([]);
@@ -59,7 +59,7 @@ const getData = async () => {
data.value = res.data.data || []; data.value = res.data.data || [];
page.value.ItemCount = res.data.count; page.value.ItemCount = res.data.count;
} catch (error) { } catch (error) {
showToast({title: error.msg, icon: 'none'}); showToast({ title: error.msg, icon: 'none' });
} }
}; };
</script> </script>

View File

@@ -3,7 +3,7 @@
<view v-if="data.length > 0"> <view v-if="data.length > 0">
<view <view
class="card-list" class="card-list"
v-for="(item, index) in (data as any[])" v-for="(item, index) in data as any[]"
:key="index"> :key="index">
<view class="left"> <view class="left">
<image :src="item.avatarUrl" /> <image :src="item.avatarUrl" />
@@ -27,9 +27,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import {useLoad, showToast} from '@tarojs/taro'; import { useLoad, showToast } from '@tarojs/taro';
import {getTGUserList} from '../../../../api/user'; import { getTGUserList } from '../../../../api/user';
useLoad(() => { useLoad(() => {
getData(); getData();
@@ -37,7 +37,7 @@ useLoad(() => {
const data = ref([]); const data = ref([]);
const page = ref({PageNum: 1, PageSize: 10, ItemCount: 0}); const page = ref({ PageNum: 1, PageSize: 10, ItemCount: 0 });
const pageChange = (e: number) => { const pageChange = (e: number) => {
page.value.PageNum = e; page.value.PageNum = e;
@@ -53,7 +53,7 @@ const getData = async () => {
data.value = res.data.data || []; data.value = res.data.data || [];
page.value.ItemCount = res.data.count; page.value.ItemCount = res.data.count;
} catch (error) { } catch (error) {
showToast({title: error.msg, icon: 'none'}); showToast({ title: error.msg, icon: 'none' });
} }
}; };
</script> </script>

View File

@@ -1,14 +1,35 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import UserModal from '@/components/UserModal.vue'; import UserModal from '@/components/UserModal.vue';
import {ref} from 'vue'; import { ref } from 'vue';
import {getPhone, login, getPersonalInfo} from '@/api/user'; import { getPhone, login, getPersonalInfo } from '@/api/user';
import logoImg from '../../../static/logo.jpg'; // import logoImg from '../../../static/logo.jpg';
import { Left, Home } from '@nutui/icons-vue-taro';
const statusBarHeight = Taro.getSystemInfoSync().statusBarHeight;
const BarHeight = ref((statusBarHeight as number) - 7);
const appName = process.env.TARO_APP_NAME;
const logoImg = require(process.env.TARO_APP_LOGO_IMG as string);
// const logoImg = process.env.TARO_APP_LOGO_IMG;
const isShow = ref(false); const isShow = ref(false);
const val = ref(false); const val = ref(false);
const returns = () => {
Taro.navigateBack({
delta: 1,
});
};
const goHome = () => {
Taro.switchTab({
url: '/pages/index/index',
});
};
const getCode = () => { const getCode = () => {
if (!val.value) if (!val.value)
return Taro.showToast({ return Taro.showToast({
@@ -53,7 +74,7 @@ const getPhoneNumber = async (e: any) => {
title: '授权手机号中', title: '授权手机号中',
mask: true, mask: true,
}); });
const {code} = e.detail; const { code } = e.detail;
const res = await getPhone({ const res = await getPhone({
code: code, code: code,
}); });
@@ -133,10 +154,16 @@ const clickText = (type: number, text: string) => {
<template> <template>
<view class="wrapper"> <view class="wrapper">
<view class="head-wrapper" :style="{ top: BarHeight + 'px' }">
<view class="head-menu">
<!-- <Left class="iconfont" @click="returns" /> -->
<Home class="iconfont" @click="goHome" />
</view>
</view>
<image src="../../../static/wechat_login.jpg" /> <image src="../../../static/wechat_login.jpg" />
<view class="logo"> <view class="logo">
<image :src="logoImg" /> <image :src="logoImg"></image>
<view>捷兑通</view> <view>{{ appName }}</view>
</view> </view>
<view class="center"> <view class="center">
<nut-button <nut-button
@@ -227,4 +254,30 @@ page {
display: flex; display: flex;
} }
} }
.head-wrapper {
z-index: 999;
display: flex;
align-items: center;
position: fixed;
left: 30px;
top: 0;
//height: 114px;
}
.head-menu {
display: flex;
align-items: center;
height: 54px;
width: 100px;
background: rgba(0, 0, 0, 0.25);
border-radius: 27px;
.iconfont {
flex: 1;
text-align: center;
color: #fff;
box-sizing: border-box;
}
}
</style> </style>

View File

@@ -1,9 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import Pay from '@/components/Pay.vue'; import Pay from '@/components/Pay.vue';
import {getActiveOrderList, deleteActiveOrder} from '@/api/goods'; import { getActiveOrderList, deleteActiveOrder } from '@/api/goods';
import {getOrderStatistics} from '@/api/order'; import { getOrderStatistics } from '@/api/order';
import UQRCode from 'uqrcodejs'; import UQRCode from 'uqrcodejs';
const tabValue = ref(0); const tabValue = ref(0);
@@ -97,7 +97,11 @@ const getList = async () => {
const res = await getActiveOrderList({ const res = await getActiveOrderList({
status: tabValue.value, status: tabValue.value,
}); });
orderList.value = res.data.data; if (res.data.data.length >= 2) {
orderList.value = res.data.data.slice(0, 2);
} else {
orderList.value = res.data.data;
}
} catch (error) { } catch (error) {
Taro.showToast({ Taro.showToast({
title: error.msg, title: error.msg,
@@ -162,7 +166,7 @@ const toDetail = (item: any) => {
const delOrder = async (oid: string) => { const delOrder = async (oid: string) => {
try { try {
await deleteActiveOrder({oid}); await deleteActiveOrder({ oid });
} catch (error) { } catch (error) {
Taro.showToast({ Taro.showToast({
title: error.msg, title: error.msg,
@@ -249,7 +253,9 @@ const closed = () => {
>{{ item.title }} >{{ item.title }}
</view> </view>
<!-- <view>{{ item.num }}</view> --> <!-- <view>{{ item.num }}</view> -->
<view class="line" :class="{lineColor: item.value === tabValue}"></view> <view
class="line"
:class="{ lineColor: item.value === tabValue }"></view>
</view> </view>
</view> </view>
<view v-if="orderList.length > 0"> <view v-if="orderList.length > 0">
@@ -266,19 +272,19 @@ const closed = () => {
item.status === 0 item.status === 0
? '#FF850A' ? '#FF850A'
: item.status === 1 : item.status === 1
? '#F83D3D' ? '#F83D3D'
: item.status === 2 : item.status === 2
? '#333333' ? '#333333'
: '#9C9C9C', : '#9C9C9C',
}" }"
>{{ >{{
item.status === 0 item.status === 0
? '待付款' ? '待付款'
: item.status === 1 : item.status === 1
? '待使用' ? '待使用'
: item.status === 2 : item.status === 2
? '已使用' ? '已使用'
: '已失效' : '已失效'
}} }}
</view> </view>
</view> </view>

View File

@@ -77,11 +77,11 @@
<image <image
@tap="toPhone()" @tap="toPhone()"
class="w-[50px] h-[50px]" class="w-[50px] h-[50px]"
src="http://p0.meituan.net/csc/ab0493b124a6bb858bf82a2340767c0d919.png" /> src="https://p0.meituan.net/csc/ab0493b124a6bb858bf82a2340767c0d919.png" />
<image <image
@tap="toAdder()" @tap="toAdder()"
class="w-[50px] h-[50px] ml-2" class="w-[50px] h-[50px] ml-2"
src="http://p1.meituan.net/csc/92ee8512c90527169b44e07fd11d250d924.png" /> src="https://p1.meituan.net/csc/92ee8512c90527169b44e07fd11d250d924.png" />
</view> </view>
</view> </view>
</view> </view>
@@ -146,10 +146,10 @@
goodInfo.status === 0 goodInfo.status === 0
? '待付款' ? '待付款'
: goodInfo.status === 1 : goodInfo.status === 1
? '待使用' ? '待使用'
: goodInfo.status === 2 : goodInfo.status === 2
? '已使用' ? '已使用'
: '已失效' : '已失效'
"></nut-cell> "></nut-cell>
</nut-cell-group> </nut-cell-group>
@@ -232,13 +232,13 @@
<script setup lang="ts"> <script setup lang="ts">
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {onUnmounted, ref} from 'vue'; import { onUnmounted, ref } from 'vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import Pay from '@/components/Pay.vue'; import Pay from '@/components/Pay.vue';
import {calculateDistance} from '@/utils'; import { calculateDistance } from '@/utils';
import {IconFont} from '@nutui/icons-vue-taro'; import { IconFont } from '@nutui/icons-vue-taro';
import {getActiveOrderDetail} from '@/api/goods'; import { getActiveOrderDetail } from '@/api/goods';
import UQRCode from 'uqrcodejs'; import UQRCode from 'uqrcodejs';
dayjs.extend(duration); dayjs.extend(duration);
@@ -268,6 +268,9 @@ Taro.useLoad(options => {
type.value = options.type; type.value = options.type;
oid.value = options.orderId; oid.value = options.orderId;
tId.value = Number(options.OrderType); tId.value = Number(options.OrderType);
});
Taro.useDidShow(() => {
Taro.getLocation({ Taro.getLocation({
type: 'wgs84', type: 'wgs84',
success: res => { success: res => {
@@ -277,7 +280,7 @@ Taro.useLoad(options => {
}); });
// goodInfo.value = Taro.getStorageSync('item'); // goodInfo.value = Taro.getStorageSync('item');
getOrderDetail(); getOrderDetail();
}); })
const getOrderDetail = async () => { const getOrderDetail = async () => {
const res = await getActiveOrderDetail({ const res = await getActiveOrderDetail({

View File

@@ -27,7 +27,7 @@
<view v-if="listData.length > 0"> <view v-if="listData.length > 0">
<view <view
class="card" class="card"
v-for="(item, index) in (listData as any[])" v-for="(item, index) in listData as any[]"
:key="index"> :key="index">
<view class="header"> <view class="header">
<view> <view>
@@ -74,9 +74,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue'; import { ref } from 'vue';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import {getUserAfterOrderList} from '../../../api/user'; import { getUserAfterOrderList } from '../../../api/user';
const tabsIndex = ref(0); const tabsIndex = ref(0);
@@ -121,7 +121,7 @@ const get_list = async () => {
title: '加载中', title: '加载中',
}); });
const user_info = await Taro.getStorageSync('userInfo'); const user_info = await Taro.getStorageSync('userInfo');
const {data: res} = await getUserAfterOrderList({ const { data: res } = await getUserAfterOrderList({
phone: user_info.data.phone, phone: user_info.data.phone,
status: tabsIndex.value, status: tabsIndex.value,
PageNum: pageOpt.value.page, PageNum: pageOpt.value.page,

Some files were not shown because too many files have changed in this diff Show More