fix bugs
This commit is contained in:
10
.claude/settings.local.json
Normal file
10
.claude/settings.local.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(tree:*)",
|
||||
"Bash(find:*)"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
}
|
||||
}
|
||||
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
node_modules/
|
||||
.DS_Store
|
||||
dist/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
unpackage/
|
||||
.hbuilderx/
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
18
App.vue
Normal file
18
App.vue
Normal file
@@ -0,0 +1,18 @@
|
||||
<script>
|
||||
export default {
|
||||
onLaunch: function() {
|
||||
console.log('App Launch')
|
||||
},
|
||||
onShow: function() {
|
||||
console.log('App Show')
|
||||
},
|
||||
onHide: function() {
|
||||
console.log('App Hide')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
|
||||
@import "common/common.css";
|
||||
</style>
|
||||
245
README.md
Normal file
245
README.md
Normal file
@@ -0,0 +1,245 @@
|
||||
# 武术评分系统 - UniApp版本
|
||||
|
||||
这是一个基于UniApp开发的武术比赛评分系统,支持H5和小程序平台。
|
||||
|
||||
## 项目简介
|
||||
|
||||
本项目是一个完整的武术比赛评分管理系统,包含评委打分、裁判长修改评分、多场地管理等功能。
|
||||
|
||||
## 功能特点
|
||||
|
||||
- ✅ 支持H5和微信小程序双平台
|
||||
- ✅ 评委登录与评分功能
|
||||
- ✅ 裁判长评分修改功能
|
||||
- ✅ 多场地、多项目切换
|
||||
- ✅ 扣分项多选功能
|
||||
- ✅ 精确到0.001分的评分控制
|
||||
- ✅ 实时评分统计
|
||||
|
||||
## 页面结构
|
||||
|
||||
### 1. 登录页面 (`pages/login/login.vue`)
|
||||
- 输入比赛编码
|
||||
- 输入评委邀请码
|
||||
- 验证登录
|
||||
|
||||
### 2. 评分列表页 (`pages/score-list/score-list.vue`)
|
||||
- 显示比赛信息
|
||||
- 查看选手列表
|
||||
- 评委评分入口
|
||||
- 显示我的评分和总分
|
||||
|
||||
### 3. 修改评分页 (`pages/modify-score/modify-score.vue`)
|
||||
- 裁判长专用功能
|
||||
- 查看所有评委评分
|
||||
- 修改总分(±0.001分)
|
||||
- 添加修改备注
|
||||
|
||||
### 4. 多场地评分列表页 (`pages/score-list-multi/score-list-multi.vue`)
|
||||
- 场地切换功能
|
||||
- 项目切换功能
|
||||
- 裁判长可查看所有场地
|
||||
- 普通评委仅看自己的场地
|
||||
|
||||
### 5. 评分详情页 (`pages/score-detail/score-detail.vue`)
|
||||
- 评委打分界面
|
||||
- 分数精确调整(±0.001分)
|
||||
- 扣分项多选
|
||||
- 添加评分备注
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **框架**: UniApp
|
||||
- **前端**: Vue.js 2.x
|
||||
- **样式**: CSS3 (支持rpx单位)
|
||||
- **平台支持**: H5、微信小程序
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
martial-admin-mini/
|
||||
├── common/ # 公共资源
|
||||
│ └── common.css # 全局样式
|
||||
├── pages/ # 页面目录
|
||||
│ ├── login/ # 登录页面
|
||||
│ ├── score-list/ # 评分列表页
|
||||
│ ├── modify-score/ # 修改评分页
|
||||
│ ├── score-list-multi/ # 多场地列表页
|
||||
│ └── score-detail/ # 评分详情页
|
||||
├── image/ # 设计图片
|
||||
├── App.vue # 应用配置
|
||||
├── manifest.json # 应用配置清单
|
||||
├── pages.json # 页面配置
|
||||
└── package.json # 项目依赖
|
||||
```
|
||||
|
||||
## 快速开始(推荐方式)
|
||||
|
||||
### 使用HBuilderX运行(最简单)
|
||||
|
||||
1. **下载并安装HBuilderX**
|
||||
- 官网下载:https://www.dcloud.io/hbuilderx.html
|
||||
- 建议下载标准版或App开发版
|
||||
|
||||
2. **打开项目**
|
||||
- 打开HBuilderX
|
||||
- 点击菜单:文件 -> 打开目录
|
||||
- 选择本项目的根目录:`martial-admin-mini`
|
||||
|
||||
3. **运行到H5**
|
||||
- 在项目管理器中,右键点击项目根目录
|
||||
- 选择:运行 -> 运行到浏览器 -> Chrome(或其他浏览器)
|
||||
- 浏览器会自动打开并显示项目
|
||||
|
||||
4. **运行到微信小程序**
|
||||
- 首先安装并打开微信开发者工具
|
||||
- 在HBuilderX中,右键点击项目根目录
|
||||
- 选择:运行 -> 运行到小程序模拟器 -> 微信开发者工具
|
||||
- 首次运行会提示配置小程序工具路径,按提示配置即可
|
||||
|
||||
### 常见问题解决
|
||||
|
||||
#### 问题1:HBuilderX提示"未安装依赖"或"缺少插件"
|
||||
**解决方案:**
|
||||
- 点击HBuilderX顶部菜单:工具 -> 插件安装
|
||||
- 安装以下插件:
|
||||
- uni-app编译器(必需)
|
||||
- App真机运行(如需真机调试)
|
||||
- 微信小程序支持(如需开发小程序)
|
||||
|
||||
#### 问题2:运行时报错"Cannot find module"
|
||||
**解决方案:**
|
||||
```bash
|
||||
# 在项目根目录执行
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 问题3:小程序无法运行
|
||||
**解决方案:**
|
||||
1. 确保已安装微信开发者工具
|
||||
2. 在HBuilderX中配置微信开发者工具路径:
|
||||
- 工具 -> 设置 -> 运行配置 -> 小程序运行配置
|
||||
- 配置微信开发者工具的安装路径
|
||||
3. 在manifest.json中配置小程序appid(或使用测试号)
|
||||
|
||||
#### 问题4:H5运行时样式异常
|
||||
**解决方案:**
|
||||
- 清除浏览器缓存后重新运行
|
||||
- 或使用Ctrl+F5强制刷新
|
||||
|
||||
## 开发指南
|
||||
|
||||
### 环境要求
|
||||
|
||||
- HBuilderX 3.0+ (推荐)
|
||||
- 或 Node.js 12+ + Vue CLI
|
||||
- 微信开发者工具 (小程序开发需要)
|
||||
|
||||
### 方式一:使用HBuilderX(推荐)
|
||||
|
||||
1. 使用HBuilderX打开项目根目录
|
||||
2. 点击运行 -> 运行到浏览器 (H5开发)
|
||||
3. 或点击运行 -> 运行到小程序模拟器 -> 微信开发者工具
|
||||
|
||||
### 方式二:使用命令行
|
||||
|
||||
#### 安装依赖
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 运行项目
|
||||
|
||||
**H5开发**
|
||||
```bash
|
||||
npm run dev:h5
|
||||
```
|
||||
|
||||
**微信小程序开发**
|
||||
```bash
|
||||
npm run dev:mp-weixin
|
||||
```
|
||||
|
||||
**构建H5**
|
||||
```bash
|
||||
npm run build:h5
|
||||
```
|
||||
|
||||
**构建微信小程序**
|
||||
```bash
|
||||
npm run build:mp-weixin
|
||||
```
|
||||
|
||||
## 设计还原说明
|
||||
|
||||
本项目严格按照提供的5张设计图进行一比一还原:
|
||||
|
||||
1. **颜色方案**
|
||||
- 主色调:绿色 (#1B7C5E - #2A9D7E 渐变)
|
||||
- 强调色:红色 (#FF4D6A) - 用于提示信息
|
||||
- 背景色:浅灰 (#F5F5F5)
|
||||
|
||||
2. **字体大小**
|
||||
- 导航标题:36rpx
|
||||
- 页面标题:40rpx
|
||||
- 正文内容:26-32rpx
|
||||
- 提示文字:22-24rpx
|
||||
|
||||
3. **间距与圆角**
|
||||
- 卡片圆角:16rpx
|
||||
- 按钮圆角:8-16rpx
|
||||
- 标准间距:30rpx
|
||||
- 内边距:20-40rpx
|
||||
|
||||
4. **交互效果**
|
||||
- 按钮点击反馈
|
||||
- 分数增减控制
|
||||
- 多选框交互
|
||||
- 页面跳转动画
|
||||
|
||||
## 功能说明
|
||||
|
||||
### 评分规则
|
||||
|
||||
- 分数范围:5.0 - 10.0 分
|
||||
- 精度:0.001 分
|
||||
- 评委评分保留3位小数
|
||||
- 裁判长可修改总分 ±0.005 分
|
||||
|
||||
### 权限区分
|
||||
|
||||
- **普通评委**:仅能查看和评分自己负责的场地和项目
|
||||
- **裁判长**:可查看所有场地和项目,可修改评分
|
||||
|
||||
### 扣分项
|
||||
|
||||
- 支持多选
|
||||
- 每个项目可配置不同的扣分项
|
||||
- 扣分项选择后自动计入总分
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 本项目为静态实现,未包含后端接口对接
|
||||
2. 所有数据均为静态mock数据
|
||||
3. 页面跳转已配置,可直接运行演示
|
||||
4. 适配了主流手机屏幕尺寸
|
||||
|
||||
## 后续开发建议
|
||||
|
||||
如需接入真实业务,建议进行以下开发:
|
||||
|
||||
1. 接入后端API接口
|
||||
2. 实现用户身份验证
|
||||
3. 实现实时数据同步
|
||||
4. 添加数据持久化存储
|
||||
5. 增加网络异常处理
|
||||
6. 优化性能和加载速度
|
||||
7. 添加数据加密和安全验证
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 联系方式
|
||||
|
||||
如有问题或建议,请联系项目负责人。
|
||||
30
common/common.css
Normal file
30
common/common.css
Normal file
@@ -0,0 +1,30 @@
|
||||
/* 全局样式 */
|
||||
page {
|
||||
background-color: #F5F5F5;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB',
|
||||
'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
/* 防止系统样式影响 */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* 清除默认样式 */
|
||||
view, text, button, input {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
button {
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
button::after {
|
||||
border: none;
|
||||
}
|
||||
|
||||
input {
|
||||
outline: none;
|
||||
}
|
||||
BIN
image/微信图片_20251127191641_250_2.png
Normal file
BIN
image/微信图片_20251127191641_250_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
BIN
image/微信图片_20251127191649_251_2.png
Normal file
BIN
image/微信图片_20251127191649_251_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 91 KiB |
BIN
image/微信图片_20251127191659_252_2.png
Normal file
BIN
image/微信图片_20251127191659_252_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
BIN
image/微信图片_20251127191706_253_2.png
Normal file
BIN
image/微信图片_20251127191706_253_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
BIN
image/微信图片_20251127191716_254_2.png
Normal file
BIN
image/微信图片_20251127191716_254_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
17
index.html
Normal file
17
index.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||
<title>武术评分系统</title>
|
||||
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>请开启JavaScript运行本应用</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
||||
11
main.js
Normal file
11
main.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import Vue from 'vue'
|
||||
import App from './App'
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
App.mpType = 'app'
|
||||
|
||||
const app = new Vue({
|
||||
...App
|
||||
})
|
||||
app.$mount()
|
||||
67
manifest.json
Normal file
67
manifest.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"name" : "武术评分系统",
|
||||
"appid" : "",
|
||||
"description" : "武术比赛评分系统",
|
||||
"versionName" : "1.0.0",
|
||||
"versionCode" : "100",
|
||||
"transformPx" : false,
|
||||
"app-plus" : {
|
||||
"usingComponents" : true,
|
||||
"nvueStyleCompiler" : "uni-app",
|
||||
"compilerVersion" : 3,
|
||||
"splashscreen" : {
|
||||
"alwaysShowBeforeRender" : true,
|
||||
"waiting" : true,
|
||||
"autoclose" : true,
|
||||
"delay" : 0
|
||||
},
|
||||
"modules" : {},
|
||||
"distribute" : {
|
||||
"android" : {
|
||||
"permissions" : [
|
||||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
|
||||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
|
||||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
|
||||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
|
||||
"<uses-feature android:name=\"android.hardware.camera\"/>",
|
||||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
|
||||
]
|
||||
},
|
||||
"ios" : {},
|
||||
"sdkConfigs" : {}
|
||||
}
|
||||
},
|
||||
"quickapp" : {},
|
||||
"mp-weixin" : {
|
||||
"appid" : "",
|
||||
"setting" : {
|
||||
"urlCheck" : false
|
||||
},
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-alipay" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-baidu" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-toutiao" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"h5" : {
|
||||
"title" : "武术评分系统",
|
||||
"router" : {
|
||||
"mode" : "hash",
|
||||
"base" : "./"
|
||||
}
|
||||
}
|
||||
}
|
||||
12
package-lock.json
generated
Normal file
12
package-lock.json
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "martial-admin-mini",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "martial-admin-mini",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
7
package.json
Normal file
7
package.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"id": "martial-admin-mini",
|
||||
"name": "martial-admin-mini",
|
||||
"version": "1.0.0",
|
||||
"description": "武术比赛评分系统",
|
||||
"main": "main.js"
|
||||
}
|
||||
45
pages.json
Normal file
45
pages.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"pages": [
|
||||
{
|
||||
"path": "pages/login/login",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/score-list/score-list",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/modify-score/modify-score",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/score-list-multi/score-list-multi",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/score-detail/score-detail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
}
|
||||
],
|
||||
"globalStyle": {
|
||||
"navigationBarTextStyle": "white",
|
||||
"navigationBarTitleText": "评分系统",
|
||||
"navigationBarBackgroundColor": "#1B7C5E",
|
||||
"backgroundColor": "#F5F5F5"
|
||||
}
|
||||
}
|
||||
226
pages/login/login.vue
Normal file
226
pages/login/login.vue
Normal file
@@ -0,0 +1,226 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<!-- 自定义导航栏 -->
|
||||
<view class="nav-bar">
|
||||
<view class="nav-title">评分系统</view>
|
||||
<view class="nav-right">
|
||||
<view class="icon-menu">···</view>
|
||||
<view class="icon-close">⊗</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 主体内容 -->
|
||||
<view class="content">
|
||||
<view class="page-title">进入评分</view>
|
||||
|
||||
<!-- 比赛编码输入 -->
|
||||
<view class="input-group">
|
||||
<view class="input-label">比赛编码</view>
|
||||
<view class="input-wrapper">
|
||||
<input
|
||||
class="input-field"
|
||||
type="text"
|
||||
placeholder="请输入比赛编码"
|
||||
v-model="matchCode"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 评委邀请码输入 -->
|
||||
<view class="input-group">
|
||||
<view class="input-label">评委邀请码</view>
|
||||
<view class="input-wrapper">
|
||||
<input
|
||||
class="input-field"
|
||||
type="text"
|
||||
placeholder="请输入评委邀请码"
|
||||
v-model="inviteCode"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 立即评分按钮 -->
|
||||
<button class="submit-btn" @click="handleSubmit">立即评分</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
matchCode: '',
|
||||
inviteCode: ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleSubmit() {
|
||||
if (!this.matchCode) {
|
||||
uni.showToast({
|
||||
title: '请输入比赛编码',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if (!this.inviteCode) {
|
||||
uni.showToast({
|
||||
title: '请输入评委邀请码',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 判断权限类型
|
||||
const role = this.inviteCode.toLowerCase()
|
||||
|
||||
if (role !== 'pub' && role !== 'admin') {
|
||||
uni.showToast({
|
||||
title: '邀请码错误,请输入pub或admin',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 保存用户角色到全局数据
|
||||
getApp().globalData = {
|
||||
userRole: role,
|
||||
matchCode: this.matchCode
|
||||
}
|
||||
|
||||
// 根据角色跳转到不同页面
|
||||
if (role === 'admin') {
|
||||
// 裁判长跳转到多场地列表页(可以修改评分)
|
||||
uni.navigateTo({
|
||||
url: '/pages/score-list-multi/score-list-multi'
|
||||
})
|
||||
} else {
|
||||
// 普通裁判跳转到评分列表页(可以评分)
|
||||
uni.navigateTo({
|
||||
url: '/pages/score-list/score-list'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container {
|
||||
min-height: 100vh;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
|
||||
/* 导航栏 */
|
||||
.nav-bar {
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.nav-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
letter-spacing: 2rpx;
|
||||
}
|
||||
|
||||
.nav-right {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 30rpx;
|
||||
}
|
||||
|
||||
.icon-menu,
|
||||
.icon-close {
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 主体内容 */
|
||||
.content {
|
||||
padding: 60rpx 40rpx;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
font-size: 40rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
margin-bottom: 60rpx;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* 输入组 */
|
||||
.input-group {
|
||||
margin-bottom: 40rpx;
|
||||
}
|
||||
|
||||
.input-label {
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.input-wrapper {
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.input-field {
|
||||
width: 100%;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.input-field::placeholder {
|
||||
color: #CCCCCC;
|
||||
}
|
||||
|
||||
.input-tip {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
/* 提交按钮 */
|
||||
.submit-btn {
|
||||
width: 100%;
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
border-radius: 16rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 80rpx;
|
||||
box-shadow: 0 8rpx 20rpx rgba(27, 124, 94, 0.3);
|
||||
}
|
||||
|
||||
.submit-btn:active {
|
||||
opacity: 0.9;
|
||||
}
|
||||
</style>
|
||||
447
pages/modify-score/modify-score.vue
Normal file
447
pages/modify-score/modify-score.vue
Normal file
@@ -0,0 +1,447 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<!-- 自定义导航栏 -->
|
||||
<view class="nav-bar">
|
||||
<view class="nav-left" @click="goBack">
|
||||
<text class="back-icon">‹</text>
|
||||
</view>
|
||||
<view class="nav-title">修改评分</view>
|
||||
<view class="nav-right">
|
||||
<view class="icon-menu">···</view>
|
||||
<view class="icon-close">⊗</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 选手信息 -->
|
||||
<view class="player-info-section">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
<view class="total-score-label">
|
||||
<text class="label-text">总分:</text>
|
||||
<text class="score-value">8.907</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="player-details">
|
||||
<view class="detail-item">身份证:123456789000000000</view>
|
||||
<view class="detail-item">队伍:少林寺武术大学院</view>
|
||||
<view class="detail-item">编号:123-4567898275</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 评委评分统计 -->
|
||||
<view class="judges-section">
|
||||
<view class="section-title">共有6位评委完成评分</view>
|
||||
<view class="judges-scores">
|
||||
<view class="judge-score-item">
|
||||
<text class="judge-name">欧阳丽娜:</text>
|
||||
<text class="judge-score">8.907</text>
|
||||
</view>
|
||||
<view class="judge-score-item">
|
||||
<text class="judge-name">张三:</text>
|
||||
<text class="judge-score">8.901</text>
|
||||
</view>
|
||||
<view class="judge-score-item">
|
||||
<text class="judge-name">裁判姓名:</text>
|
||||
<text class="judge-score">8.902</text>
|
||||
</view>
|
||||
<view class="judge-score-item">
|
||||
<text class="judge-name">裁判姓名:</text>
|
||||
<text class="judge-score">8.907</text>
|
||||
</view>
|
||||
<view class="judge-score-item">
|
||||
<text class="judge-name">裁判姓名:</text>
|
||||
<text class="judge-score">8.905</text>
|
||||
</view>
|
||||
<view class="judge-score-item">
|
||||
<text class="judge-name">裁判姓名:</text>
|
||||
<text class="judge-score">8.904</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 修改总分区域 -->
|
||||
<view class="modify-section">
|
||||
<view class="modify-header">
|
||||
<text class="modify-label">修改总分(+-0.005分)</text>
|
||||
</view>
|
||||
|
||||
<view class="score-control">
|
||||
<view class="control-btn decrease" @click="decreaseScore">
|
||||
<text class="btn-symbol">-</text>
|
||||
<text class="btn-value">-0.001</text>
|
||||
</view>
|
||||
|
||||
<view class="score-display">
|
||||
<text class="current-score">{{ currentScore.toFixed(3) }}</text>
|
||||
<text class="no-modify-text">可不改</text>
|
||||
</view>
|
||||
|
||||
<view class="control-btn increase" @click="increaseScore">
|
||||
<text class="btn-symbol">+</text>
|
||||
<text class="btn-value">+0.001</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- <view class="modify-tip">
|
||||
裁判长修改:保留3位小数点,超过上限或下限时,按钮置灰
|
||||
</view> -->
|
||||
</view>
|
||||
|
||||
<!-- 备注 -->
|
||||
<view class="note-section">
|
||||
<view class="note-label">
|
||||
<text>备注:</text>
|
||||
</view>
|
||||
<view class="note-input-wrapper">
|
||||
<textarea
|
||||
class="note-input"
|
||||
placeholder="请输入修改备注"
|
||||
v-model="note"
|
||||
maxlength="200"
|
||||
/>
|
||||
<text class="optional-text">可不填</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 修改按钮 -->
|
||||
<button class="modify-btn" @click="handleModify">修改</button>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
currentScore: 8.907,
|
||||
note: '',
|
||||
minScore: 5.0,
|
||||
maxScore: 10.0
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
goBack() {
|
||||
uni.navigateBack()
|
||||
},
|
||||
decreaseScore() {
|
||||
if (this.currentScore > this.minScore) {
|
||||
this.currentScore = parseFloat((this.currentScore - 0.001).toFixed(3))
|
||||
}
|
||||
},
|
||||
increaseScore() {
|
||||
if (this.currentScore < this.maxScore) {
|
||||
this.currentScore = parseFloat((this.currentScore + 0.001).toFixed(3))
|
||||
}
|
||||
},
|
||||
handleModify() {
|
||||
uni.showToast({
|
||||
title: '修改成功',
|
||||
icon: 'success'
|
||||
})
|
||||
setTimeout(() => {
|
||||
uni.navigateBack()
|
||||
}, 1500)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container {
|
||||
min-height: 100vh;
|
||||
background-color: #F5F5F5;
|
||||
padding-bottom: 40rpx;
|
||||
}
|
||||
|
||||
/* 导航栏 */
|
||||
.nav-bar {
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.nav-left {
|
||||
position: absolute;
|
||||
left: 30rpx;
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.back-icon {
|
||||
font-size: 60rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: 300;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.nav-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
letter-spacing: 2rpx;
|
||||
}
|
||||
|
||||
.nav-right {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 30rpx;
|
||||
}
|
||||
|
||||
.icon-menu,
|
||||
.icon-close {
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 选手信息 */
|
||||
.player-info-section {
|
||||
margin: 30rpx;
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.player-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.player-name {
|
||||
font-size: 34rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.total-score-label {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
}
|
||||
|
||||
.label-text {
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.score-value {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
margin-left: 8rpx;
|
||||
}
|
||||
|
||||
.player-details {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12rpx;
|
||||
}
|
||||
|
||||
.detail-item {
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* 评委评分统计 */
|
||||
.judges-section {
|
||||
margin: 30rpx;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 30rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.judges-scores {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20rpx;
|
||||
}
|
||||
|
||||
.judge-score-item {
|
||||
font-size: 26rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.judge-name {
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.judge-score {
|
||||
color: #333333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 修改总分区域 */
|
||||
.modify-section {
|
||||
margin: 30rpx;
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 40rpx 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.modify-header {
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
|
||||
.modify-label {
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.score-control {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
width: 140rpx;
|
||||
height: 140rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #F5F5F5;
|
||||
border-radius: 12rpx;
|
||||
}
|
||||
|
||||
.control-btn.decrease {
|
||||
background-color: #FFE5E5;
|
||||
}
|
||||
|
||||
.control-btn.increase {
|
||||
background-color: #E5F5F0;
|
||||
}
|
||||
|
||||
.btn-symbol {
|
||||
font-size: 48rpx;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.control-btn.decrease .btn-symbol {
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.control-btn.increase .btn-symbol {
|
||||
color: #1B7C5E;
|
||||
}
|
||||
|
||||
.btn-value {
|
||||
font-size: 24rpx;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
|
||||
.control-btn.decrease .btn-value {
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.control-btn.increase .btn-value {
|
||||
color: #1B7C5E;
|
||||
}
|
||||
|
||||
.score-display {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.current-score {
|
||||
font-size: 60rpx;
|
||||
font-weight: 600;
|
||||
color: #1B7C5E;
|
||||
}
|
||||
|
||||
.no-modify-text {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
|
||||
.modify-tip {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
line-height: 1.6;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* 备注 */
|
||||
.note-section {
|
||||
margin: 30rpx;
|
||||
}
|
||||
|
||||
.note-label {
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.note-input-wrapper {
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.note-input {
|
||||
width: 100%;
|
||||
min-height: 120rpx;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.note-input::placeholder {
|
||||
color: #CCCCCC;
|
||||
}
|
||||
|
||||
.optional-text {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
bottom: 30rpx;
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
/* 修改按钮 */
|
||||
.modify-btn {
|
||||
margin: 30rpx;
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
border-radius: 16rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: 0 8rpx 20rpx rgba(27, 124, 94, 0.3);
|
||||
}
|
||||
|
||||
.modify-btn:active {
|
||||
opacity: 0.9;
|
||||
}
|
||||
</style>
|
||||
441
pages/score-detail/score-detail.vue
Normal file
441
pages/score-detail/score-detail.vue
Normal file
@@ -0,0 +1,441 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<!-- 自定义导航栏 -->
|
||||
<view class="nav-bar">
|
||||
<view class="nav-left" @click="goBack">
|
||||
<text class="back-icon">‹</text>
|
||||
</view>
|
||||
<view class="nav-title">评分详情</view>
|
||||
<view class="nav-right">
|
||||
<view class="icon-menu">···</view>
|
||||
<view class="icon-close">⊗</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 选手信息 -->
|
||||
<view class="player-info-section">
|
||||
<view class="player-name">张三</view>
|
||||
<view class="player-details">
|
||||
<view class="detail-item">身份证:123456789000000000</view>
|
||||
<view class="detail-item">队伍:少林寺武术大学院</view>
|
||||
<view class="detail-item">编号:123-4567898275</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 评分提示 -->
|
||||
<view class="score-tip">
|
||||
点击分数填写或拖动滑块打分(5-10分)
|
||||
</view>
|
||||
|
||||
<!-- 分数调整 -->
|
||||
<view class="score-control">
|
||||
<view class="control-btn decrease" @click="decreaseScore">
|
||||
<text class="btn-symbol">-</text>
|
||||
<!-- <text class="btn-value">-0.001</text> -->
|
||||
</view>
|
||||
|
||||
<view class="score-display">
|
||||
<text class="current-score">{{ currentScore.toFixed(3) }}</text>
|
||||
</view>
|
||||
|
||||
<view class="control-btn increase" @click="increaseScore">
|
||||
<text class="btn-symbol">+</text>
|
||||
<!-- <text class="btn-value">+0.001</text> -->
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- <view class="judge-tip">
|
||||
裁判评分:保留3位小数点,超过上限或下限时,按钮置灰
|
||||
</view> -->
|
||||
|
||||
<!-- 扣分项 -->
|
||||
<view class="deduction-section">
|
||||
<view class="deduction-header">
|
||||
<text class="deduction-label">扣分项:</text>
|
||||
<!-- <text class="deduction-hint">扣分项多选</text> -->
|
||||
</view>
|
||||
|
||||
<view class="deduction-list">
|
||||
<view
|
||||
v-for="(item, index) in deductions"
|
||||
:key="index"
|
||||
class="deduction-item"
|
||||
@click="toggleDeduction(index)"
|
||||
>
|
||||
<view :class="['checkbox', item.checked ? 'checked' : '']">
|
||||
<text v-if="item.checked" class="check-icon">✓</text>
|
||||
</view>
|
||||
<text class="deduction-text">{{ item.text }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 备注 -->
|
||||
<view class="note-section">
|
||||
<view class="note-label">
|
||||
<text>备注:</text>
|
||||
</view>
|
||||
<view class="note-input-wrapper">
|
||||
<textarea
|
||||
class="note-input"
|
||||
placeholder="请输入修改备注"
|
||||
v-model="note"
|
||||
maxlength="200"
|
||||
/>
|
||||
<!-- <text class="optional-text">可不填</text> -->
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 提交按钮 -->
|
||||
<button class="submit-btn" @click="handleSubmit">提交</button>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
currentScore: 8.907,
|
||||
note: '',
|
||||
minScore: 5.0,
|
||||
maxScore: 10.0,
|
||||
deductions: [
|
||||
{ text: '扣分项描述', checked: false },
|
||||
{ text: '扣分项描述', checked: false },
|
||||
{ text: '扣分项描述', checked: true },
|
||||
{ text: '扣分项描述', checked: false },
|
||||
{ text: '扣分项描述', checked: false },
|
||||
{ text: '扣分项描述', checked: true },
|
||||
{ text: '扣分项描述', checked: true },
|
||||
{ text: '扣分项描述', checked: false }
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
goBack() {
|
||||
uni.navigateBack()
|
||||
},
|
||||
decreaseScore() {
|
||||
if (this.currentScore > this.minScore) {
|
||||
this.currentScore = parseFloat((this.currentScore - 0.001).toFixed(3))
|
||||
}
|
||||
},
|
||||
increaseScore() {
|
||||
if (this.currentScore < this.maxScore) {
|
||||
this.currentScore = parseFloat((this.currentScore + 0.001).toFixed(3))
|
||||
}
|
||||
},
|
||||
toggleDeduction(index) {
|
||||
this.deductions[index].checked = !this.deductions[index].checked
|
||||
},
|
||||
handleSubmit() {
|
||||
uni.showToast({
|
||||
title: '提交成功',
|
||||
icon: 'success'
|
||||
})
|
||||
setTimeout(() => {
|
||||
uni.navigateBack()
|
||||
}, 1500)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container {
|
||||
min-height: 100vh;
|
||||
background-color: #F5F5F5;
|
||||
padding-bottom: 40rpx;
|
||||
}
|
||||
|
||||
/* 导航栏 */
|
||||
.nav-bar {
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.nav-left {
|
||||
position: absolute;
|
||||
left: 30rpx;
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.back-icon {
|
||||
font-size: 60rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: 300;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.nav-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
letter-spacing: 2rpx;
|
||||
}
|
||||
|
||||
.nav-right {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 30rpx;
|
||||
}
|
||||
|
||||
.icon-menu,
|
||||
.icon-close {
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 选手信息 */
|
||||
.player-info-section {
|
||||
margin: 30rpx;
|
||||
}
|
||||
|
||||
.player-name {
|
||||
font-size: 34rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.player-details {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8rpx;
|
||||
}
|
||||
|
||||
.detail-item {
|
||||
font-size: 26rpx;
|
||||
color: #CD8B6F;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* 评分提示 */
|
||||
.score-tip {
|
||||
padding: 0 30rpx;
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
|
||||
/* 分数控制 */
|
||||
.score-control {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 60rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
width: 140rpx;
|
||||
height: 140rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #F5F5F5;
|
||||
border-radius: 12rpx;
|
||||
}
|
||||
|
||||
.control-btn.decrease {
|
||||
background-color: #FFE5E5;
|
||||
}
|
||||
|
||||
.control-btn.increase {
|
||||
background-color: #E5F5F0;
|
||||
}
|
||||
|
||||
.btn-symbol {
|
||||
font-size: 48rpx;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.control-btn.decrease .btn-symbol {
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.control-btn.increase .btn-symbol {
|
||||
color: #1B7C5E;
|
||||
}
|
||||
|
||||
.btn-value {
|
||||
font-size: 24rpx;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
|
||||
.control-btn.decrease .btn-value {
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.control-btn.increase .btn-value {
|
||||
color: #1B7C5E;
|
||||
}
|
||||
|
||||
.score-display {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.current-score {
|
||||
font-size: 80rpx;
|
||||
font-weight: 600;
|
||||
color: #1B7C5E;
|
||||
}
|
||||
|
||||
.judge-tip {
|
||||
padding: 0 30rpx;
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
text-align: center;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
|
||||
/* 扣分项 */
|
||||
.deduction-section {
|
||||
margin: 30rpx;
|
||||
}
|
||||
|
||||
.deduction-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.deduction-label {
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.deduction-hint {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.deduction-list {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20rpx;
|
||||
}
|
||||
|
||||
.deduction-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 20rpx;
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 12rpx;
|
||||
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
border: 2rpx solid #CCCCCC;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-right: 16rpx;
|
||||
flex-shrink: 0;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
|
||||
.checkbox.checked {
|
||||
background-color: #1B7C5E;
|
||||
border-color: #1B7C5E;
|
||||
}
|
||||
|
||||
.check-icon {
|
||||
color: #FFFFFF;
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.deduction-text {
|
||||
font-size: 26rpx;
|
||||
color: #333333;
|
||||
line-height: 1.4;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* 备注 */
|
||||
.note-section {
|
||||
margin: 30rpx;
|
||||
}
|
||||
|
||||
.note-label {
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.note-input-wrapper {
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.note-input {
|
||||
width: 100%;
|
||||
min-height: 120rpx;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.note-input::placeholder {
|
||||
color: #CCCCCC;
|
||||
}
|
||||
|
||||
.optional-text {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
bottom: 30rpx;
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
/* 提交按钮 */
|
||||
.submit-btn {
|
||||
margin: 30rpx;
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
border-radius: 16rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: 0 8rpx 20rpx rgba(27, 124, 94, 0.3);
|
||||
}
|
||||
|
||||
.submit-btn:active {
|
||||
opacity: 0.9;
|
||||
}
|
||||
</style>
|
||||
408
pages/score-list-multi/score-list-multi.vue
Normal file
408
pages/score-list-multi/score-list-multi.vue
Normal file
@@ -0,0 +1,408 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<!-- 自定义导航栏 -->
|
||||
<view class="nav-bar">
|
||||
<view class="nav-title">评分系统</view>
|
||||
<view class="nav-right">
|
||||
<view class="icon-menu">···</view>
|
||||
<view class="icon-close">⊗</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 比赛信息 -->
|
||||
<view class="match-info">
|
||||
<view class="match-title">
|
||||
2025年全国武术散打锦标赛暨第十七届世界武术锦标赛选拔赛
|
||||
</view>
|
||||
<view class="match-time">比赛时间:2025年6月25日 9:00</view>
|
||||
</view>
|
||||
|
||||
<!-- 场地和项目选择 -->
|
||||
<view class="venue-section">
|
||||
<!-- 场地切换 - 横向滚动 -->
|
||||
<scroll-view class="venue-scroll" scroll-x="true" show-scrollbar="false">
|
||||
<view class="venue-tabs">
|
||||
<view
|
||||
v-for="venue in venues"
|
||||
:key="venue.id"
|
||||
:class="['venue-tab', currentVenue === venue.id ? 'active' : '']"
|
||||
@click="switchVenue(venue.id)"
|
||||
>
|
||||
{{ venue.name }}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<view class="venue-tip">
|
||||
<!-- <text class="tip-bold">裁判长可看见所有场地和项目</text> -->
|
||||
<!-- <text class="tip-normal">(场地和项目可动态全部),可以点击切换</text> -->
|
||||
</view>
|
||||
|
||||
<!-- 项目选择 - 横向滚动 -->
|
||||
<scroll-view class="project-scroll" scroll-x="true" show-scrollbar="false">
|
||||
<view class="project-list">
|
||||
<view
|
||||
v-for="(project, index) in projects"
|
||||
:key="index"
|
||||
:class="['project-btn', currentProject === index ? 'active' : '']"
|
||||
@click="switchProject(index)"
|
||||
>
|
||||
{{ project }}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
|
||||
<!-- 已评分统计 -->
|
||||
<view class="score-stats">
|
||||
<text class="stats-text">已评分:</text>
|
||||
<text class="stats-number">2/30</text>
|
||||
</view>
|
||||
|
||||
<!-- 选手列表 -->
|
||||
<view class="player-list">
|
||||
<!-- 第一个选手 - 裁判长功能 -->
|
||||
<view class="player-card">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
<view class="action-area">
|
||||
<text class="total-score">总分:8.907</text>
|
||||
<view class="chief-actions">
|
||||
<!-- <text class="chief-hint">裁判长功能:修改评分、修改按钮需等总分出来才出现</text> -->
|
||||
<button class="modify-btn" @click="goToModify">修改</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="player-info">
|
||||
<view class="info-item">身份证:123456789000000000</view>
|
||||
<view class="info-item">队伍:少林寺武术大学院</view>
|
||||
<view class="info-item">编号:123-4567898275</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 第二个选手 - 简单样式 -->
|
||||
<view class="player-card">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
</view>
|
||||
<view class="player-info">
|
||||
<view class="info-item">身份证:123456789000000000</view>
|
||||
<view class="info-item">队伍:少林寺武术大学院</view>
|
||||
<view class="info-item">编号:123-4567898275</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 第三个选手 - 简单样式 -->
|
||||
<view class="player-card">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
</view>
|
||||
<view class="player-info">
|
||||
<view class="info-item">身份证:123456789000000000</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
currentVenue: 1,
|
||||
currentProject: 0,
|
||||
venues: [
|
||||
{ id: 1, name: '第一场地' },
|
||||
{ id: 2, name: '第二场地' },
|
||||
{ id: 3, name: '第三场地' },
|
||||
{ id: 4, name: '第四场地' },
|
||||
{ id: 5, name: '第五场地' }
|
||||
],
|
||||
projects: [
|
||||
'女子组长拳',
|
||||
'男子组陈氏太极拳',
|
||||
'女子组双剑(含长穗双剑)',
|
||||
'男子组杨氏太极拳',
|
||||
'女子组刀术',
|
||||
'男子组棍术',
|
||||
'女子组枪术',
|
||||
'男子组剑术'
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
switchVenue(venue) {
|
||||
this.currentVenue = venue
|
||||
},
|
||||
switchProject(index) {
|
||||
this.currentProject = index
|
||||
},
|
||||
goToModify() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/modify-score/modify-score'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container {
|
||||
min-height: 100vh;
|
||||
background-color: #F5F5F5;
|
||||
padding-bottom: 40rpx;
|
||||
}
|
||||
|
||||
/* 导航栏 */
|
||||
.nav-bar {
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.nav-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
letter-spacing: 2rpx;
|
||||
}
|
||||
|
||||
.nav-right {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 30rpx;
|
||||
}
|
||||
|
||||
.icon-menu,
|
||||
.icon-close {
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 比赛信息 */
|
||||
.match-info {
|
||||
padding: 30rpx;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
|
||||
.match-title {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.tip-text {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.match-time {
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
/* 场地和项目区域 */
|
||||
.venue-section {
|
||||
background-color: #FFFFFF;
|
||||
margin: 20rpx 30rpx;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
/* 场地滚动容器 */
|
||||
.venue-scroll {
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.venue-tabs {
|
||||
display: inline-flex;
|
||||
gap: 30rpx;
|
||||
padding-bottom: 20rpx;
|
||||
border-bottom: 4rpx solid #E0E0E0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.venue-tab {
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #666666;
|
||||
padding: 0 20rpx;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.venue-tab.active {
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.venue-tab.active::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -24rpx;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 4rpx;
|
||||
background-color: #1B7C5E;
|
||||
}
|
||||
|
||||
.venue-tip {
|
||||
font-size: 24rpx;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.tip-bold {
|
||||
color: #FF4D6A;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.tip-normal {
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
/* 项目滚动容器 */
|
||||
.project-scroll {
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.project-list {
|
||||
display: inline-flex;
|
||||
gap: 20rpx;
|
||||
}
|
||||
|
||||
.project-btn {
|
||||
padding: 20rpx 30rpx;
|
||||
background-color: #FFFFFF;
|
||||
border: 2rpx solid #CCCCCC;
|
||||
border-radius: 8rpx;
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.project-btn.active {
|
||||
background-color: #1B7C5E;
|
||||
color: #FFFFFF;
|
||||
border-color: #1B7C5E;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 评分统计 */
|
||||
.score-stats {
|
||||
padding: 20rpx 30rpx;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.stats-text {
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.stats-number {
|
||||
color: #1B7C5E;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* 选手列表 */
|
||||
.player-list {
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.player-card {
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
margin-bottom: 20rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.player-header {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.player-name {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.action-area {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
gap: 10rpx;
|
||||
}
|
||||
|
||||
.total-score {
|
||||
font-size: 26rpx;
|
||||
color: #333333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.chief-actions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
gap: 10rpx;
|
||||
}
|
||||
|
||||
.chief-hint {
|
||||
font-size: 22rpx;
|
||||
color: #FF4D6A;
|
||||
text-align: right;
|
||||
line-height: 1.5;
|
||||
max-width: 400rpx;
|
||||
}
|
||||
|
||||
.modify-btn {
|
||||
padding: 12rpx 40rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
border-radius: 8rpx;
|
||||
font-size: 28rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.modify-btn:active {
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.player-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12rpx;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
line-height: 1.5;
|
||||
}
|
||||
</style>
|
||||
345
pages/score-list/score-list.vue
Normal file
345
pages/score-list/score-list.vue
Normal file
@@ -0,0 +1,345 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<!-- 自定义导航栏 -->
|
||||
<view class="nav-bar">
|
||||
<view class="nav-title">评分系统</view>
|
||||
<view class="nav-right">
|
||||
<view class="icon-menu">···</view>
|
||||
<view class="icon-close">⊗</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 比赛信息 -->
|
||||
<view class="match-info">
|
||||
<view class="match-title">
|
||||
2025年全国武术散打锦标赛暨第十七届世界武术锦标赛选拔赛
|
||||
</view>
|
||||
<view class="match-time">比赛时间:2025年6月25日 9:00</view>
|
||||
</view>
|
||||
|
||||
<!-- 场地和项目选择 -->
|
||||
<view class="venue-section">
|
||||
<view class="venue-header">
|
||||
<view class="venue-tab active">第一场地</view>
|
||||
</view>
|
||||
|
||||
<view class="project-section">
|
||||
<view class="project-btn active">男子组陈氏太极拳</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 已评分统计 -->
|
||||
<view class="score-stats">
|
||||
<text class="stats-text">已评分:</text>
|
||||
<text class="stats-number">2/30</text>
|
||||
</view>
|
||||
|
||||
|
||||
<!-- 选手列表 -->
|
||||
<view class="player-list">
|
||||
<!-- 第一个选手 - 显示我的评分和总分 -->
|
||||
<view class="player-card">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
<view class="player-scores">
|
||||
<text class="my-score">我的评分:8.906</text>
|
||||
<text class="total-score">总分:8.907</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="player-info">
|
||||
<view class="info-item">身份证:123456789000000000</view>
|
||||
<view class="info-item">队伍:少林寺武术大学院</view>
|
||||
<view class="info-item">编号:123-4567898275</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 第二个选手 - 裁判长功能 -->
|
||||
<view class="player-card">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
<view class="action-area">
|
||||
<button class="score-btn" @click="goToScoreDetail">评分</button>
|
||||
</view>
|
||||
</view>
|
||||
<view class="player-info">
|
||||
<view class="info-item">身份证:123456789000000000</view>
|
||||
<view class="info-item">队伍:少林寺武术大学院</view>
|
||||
<view class="info-item">编号:123-4567898275</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 第三个选手 - 简单样式 -->
|
||||
<view class="player-card">
|
||||
<view class="player-header">
|
||||
<view class="player-name">张三</view>
|
||||
<button class="score-btn" @click="goToScoreDetail">评分</button>
|
||||
</view>
|
||||
<view class="player-info">
|
||||
<view class="info-item">身份证:123456789000000000</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
goToScoreDetail() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/score-detail/score-detail'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container {
|
||||
min-height: 100vh;
|
||||
background-color: #F5F5F5;
|
||||
padding-bottom: 40rpx;
|
||||
}
|
||||
|
||||
/* 导航栏 */
|
||||
.nav-bar {
|
||||
height: 90rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.nav-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
letter-spacing: 2rpx;
|
||||
}
|
||||
|
||||
.nav-right {
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 30rpx;
|
||||
}
|
||||
|
||||
.icon-menu,
|
||||
.icon-close {
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 比赛信息 */
|
||||
.match-info {
|
||||
padding: 30rpx;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
|
||||
.match-title {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.tip-text {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.match-time {
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
/* 场地和项目区域 */
|
||||
.venue-section {
|
||||
background-color: #FFFFFF;
|
||||
margin: 20rpx 30rpx;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.venue-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 30rpx;
|
||||
padding-bottom: 20rpx;
|
||||
border-bottom: 4rpx solid #1B7C5E;
|
||||
}
|
||||
|
||||
.venue-tab {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.venue-tab.active::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -24rpx;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 4rpx;
|
||||
background-color: #1B7C5E;
|
||||
}
|
||||
|
||||
.refresh-hint {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.project-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.project-btn {
|
||||
padding: 20rpx 40rpx;
|
||||
background-color: #FFFFFF;
|
||||
border: 2rpx solid #1B7C5E;
|
||||
border-radius: 8rpx;
|
||||
font-size: 28rpx;
|
||||
color: #1B7C5E;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.project-btn.active {
|
||||
background-color: #1B7C5E;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.project-tip {
|
||||
font-size: 22rpx;
|
||||
color: #FF4D6A;
|
||||
flex: 1;
|
||||
margin-left: 20rpx;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* 评分统计 */
|
||||
.score-stats {
|
||||
padding: 20rpx 30rpx;
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.stats-text {
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.stats-number {
|
||||
color: #1B7C5E;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.warning-tip {
|
||||
padding: 0 30rpx 20rpx;
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
/* 选手列表 */
|
||||
.player-list {
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.player-card {
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 16rpx;
|
||||
padding: 30rpx;
|
||||
margin-bottom: 20rpx;
|
||||
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.player-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.player-name {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.player-scores {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
gap: 8rpx;
|
||||
}
|
||||
|
||||
.my-score {
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.total-score {
|
||||
font-size: 26rpx;
|
||||
color: #333333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.action-area {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
gap: 8rpx;
|
||||
}
|
||||
|
||||
.chief-hint {
|
||||
font-size: 24rpx;
|
||||
color: #FF4D6A;
|
||||
}
|
||||
|
||||
.score-btn {
|
||||
padding: 12rpx 40rpx;
|
||||
background: linear-gradient(135deg, #1B7C5E 0%, #2A9D7E 100%);
|
||||
border-radius: 8rpx;
|
||||
font-size: 28rpx;
|
||||
color: #FFFFFF;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.score-btn:active {
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.player-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12rpx;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
font-size: 26rpx;
|
||||
color: #666666;
|
||||
line-height: 1.5;
|
||||
}
|
||||
</style>
|
||||
0
static/.gitkeep
Normal file
0
static/.gitkeep
Normal file
73
uni.scss
Normal file
73
uni.scss
Normal file
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* 这里是uni-app内置的常用样式变量
|
||||
*
|
||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||
*
|
||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||
*/
|
||||
|
||||
/* 颜色变量 */
|
||||
|
||||
/* 主色 */
|
||||
$uni-color-primary: #1B7C5E;
|
||||
$uni-color-success: #2A9D7E;
|
||||
$uni-color-warning: #f0ad4e;
|
||||
$uni-color-error: #FF4D6A;
|
||||
|
||||
/* 文字基本颜色 */
|
||||
$uni-text-color: #333;
|
||||
$uni-text-color-inverse: #fff;
|
||||
$uni-text-color-grey: #999;
|
||||
$uni-text-color-placeholder: #CCCCCC;
|
||||
$uni-text-color-disable: #c0c0c0;
|
||||
|
||||
/* 背景颜色 */
|
||||
$uni-bg-color: #F5F5F5;
|
||||
$uni-bg-color-grey: #f8f8f8;
|
||||
$uni-bg-color-hover: #f1f1f1;
|
||||
$uni-bg-color-mask: rgba(0, 0, 0, 0.4);
|
||||
|
||||
/* 边框颜色 */
|
||||
$uni-border-color: #e5e5e5;
|
||||
|
||||
/* 尺寸变量 */
|
||||
|
||||
/* 文字尺寸 */
|
||||
$uni-font-size-sm: 24rpx;
|
||||
$uni-font-size-base: 28rpx;
|
||||
$uni-font-size-lg: 32rpx;
|
||||
|
||||
/* 图片尺寸 */
|
||||
$uni-img-size-sm: 40rpx;
|
||||
$uni-img-size-base: 52rpx;
|
||||
$uni-img-size-lg: 80rpx;
|
||||
|
||||
/* Border Radius */
|
||||
$uni-border-radius-sm: 4rpx;
|
||||
$uni-border-radius-base: 8rpx;
|
||||
$uni-border-radius-lg: 12rpx;
|
||||
$uni-border-radius-circle: 50%;
|
||||
|
||||
/* 水平间距 */
|
||||
$uni-spacing-row-sm: 10rpx;
|
||||
$uni-spacing-row-base: 20rpx;
|
||||
$uni-spacing-row-lg: 30rpx;
|
||||
|
||||
/* 垂直间距 */
|
||||
$uni-spacing-col-sm: 8rpx;
|
||||
$uni-spacing-col-base: 16rpx;
|
||||
$uni-spacing-col-lg: 24rpx;
|
||||
|
||||
/* 透明度 */
|
||||
$uni-opacity-disabled: 0.3;
|
||||
|
||||
/* 文章场景相关 */
|
||||
$uni-color-title: #2c405a;
|
||||
$uni-color-subtitle: #555555;
|
||||
$uni-color-paragraph: #3f536e;
|
||||
237
功能说明.md
Normal file
237
功能说明.md
Normal file
@@ -0,0 +1,237 @@
|
||||
# 功能更新说明
|
||||
|
||||
## ✅ 已完成功能
|
||||
|
||||
### 1. 登录权限区分功能
|
||||
|
||||
#### 使用说明:
|
||||
登录时输入不同的邀请码,会获得不同的权限:
|
||||
|
||||
- **邀请码:`pub`**
|
||||
- 角色:普通裁判
|
||||
- 权限:只能评分,不能修改
|
||||
- 登录后跳转:评分列表页(可以给选手打分)
|
||||
|
||||
- **邀请码:`admin`**
|
||||
- 角色:裁判长
|
||||
- 权限:可以查看所有场地,可以修改评分
|
||||
- 登录后跳转:多场地列表页(可以修改已有评分)
|
||||
|
||||
#### 测试步骤:
|
||||
1. 打开登录页
|
||||
2. 输入比赛编码:任意内容(如:2025WS001)
|
||||
3. 输入邀请码:
|
||||
- 输入 `pub` → 进入普通裁判模式
|
||||
- 输入 `admin` → 进入裁判长模式
|
||||
4. 点击"立即评分"按钮
|
||||
|
||||
---
|
||||
|
||||
### 2. 评分按钮跳转功能
|
||||
|
||||
#### 功能说明:
|
||||
在评分列表页,点击"评分"按钮会跳转到评分详情页
|
||||
|
||||
#### 涉及页面:
|
||||
- **评分列表页**(`pages/score-list/score-list.vue`)
|
||||
- 所有"评分"按钮都可以点击
|
||||
- 点击后跳转到评分详情页
|
||||
|
||||
- **评分详情页**(`pages/score-detail/score-detail.vue`)
|
||||
- 可以调整分数(±0.001分)
|
||||
- 可以选择多个扣分项
|
||||
- 可以填写备注
|
||||
- 点击"提交"完成评分
|
||||
|
||||
---
|
||||
|
||||
### 3. 场地横向滚动功能
|
||||
|
||||
#### 功能说明:
|
||||
裁判长登录后,在多场地列表页可以看到多个场地,并支持横向滚动切换
|
||||
|
||||
#### 场地数量:
|
||||
现在有 **5个场地**:
|
||||
1. 第一场地
|
||||
2. 第二场地
|
||||
3. 第三场地
|
||||
4. 第四场地
|
||||
5. 第五场地
|
||||
|
||||
#### 操作方式:
|
||||
- 用手指左右滑动场地标签
|
||||
- 点击场地名称可以切换当前场地
|
||||
- 选中的场地会高亮显示(加粗 + 下划线)
|
||||
|
||||
---
|
||||
|
||||
### 4. 比赛项目横向滚动功能
|
||||
|
||||
#### 功能说明:
|
||||
增加了更多比赛项目,支持横向滚动查看和切换
|
||||
|
||||
#### 项目数量:
|
||||
现在有 **8个比赛项目**:
|
||||
1. 女子组长拳
|
||||
2. 男子组陈氏太极拳
|
||||
3. 女子组双剑(含长穗双剑)
|
||||
4. 男子组杨氏太极拳
|
||||
5. 女子组刀术
|
||||
6. 男子组棍术
|
||||
7. 女子组枪术
|
||||
8. 男子组剑术
|
||||
|
||||
#### 操作方式:
|
||||
- 用手指左右滑动项目按钮
|
||||
- 点击项目按钮可以切换当前项目
|
||||
- 选中的项目会高亮显示(绿色背景)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 完整操作流程演示
|
||||
|
||||
### 普通裁判操作流程:
|
||||
|
||||
1. **登录**
|
||||
- 输入比赛编码
|
||||
- 输入邀请码:`pub`
|
||||
- 点击"立即评分"
|
||||
|
||||
2. **查看选手列表**
|
||||
- 进入评分列表页
|
||||
- 看到第一场地的选手
|
||||
|
||||
3. **给选手打分**
|
||||
- 点击选手卡片上的"评分"按钮
|
||||
- 进入评分详情页
|
||||
- 调整分数(点击 + 或 - 按钮)
|
||||
- 选择扣分项(多选)
|
||||
- 填写备注(可选)
|
||||
- 点击"提交"按钮
|
||||
|
||||
4. **完成评分**
|
||||
- 返回评分列表页
|
||||
- 继续为其他选手评分
|
||||
|
||||
---
|
||||
|
||||
### 裁判长操作流程:
|
||||
|
||||
1. **登录**
|
||||
- 输入比赛编码
|
||||
- 输入邀请码:`admin`
|
||||
- 点击"立即评分"
|
||||
|
||||
2. **切换场地**
|
||||
- 进入多场地列表页
|
||||
- 左右滑动查看所有场地(1-5场地)
|
||||
- 点击场地名称切换
|
||||
|
||||
3. **切换项目**
|
||||
- 左右滑动查看所有比赛项目(8个项目)
|
||||
- 点击项目按钮切换
|
||||
|
||||
4. **修改评分**
|
||||
- 找到已评分的选手
|
||||
- 点击"修改"按钮
|
||||
- 进入修改评分页
|
||||
- 调整总分(±0.001分)
|
||||
- 填写修改备注
|
||||
- 点击"修改"按钮提交
|
||||
|
||||
---
|
||||
|
||||
## 📱 界面展示
|
||||
|
||||
### 多场地列表页特点:
|
||||
- ✅ 支持横向滚动查看多个场地
|
||||
- ✅ 支持横向滚动查看多个项目
|
||||
- ✅ 场地和项目可自由切换
|
||||
- ✅ 选中状态清晰显示
|
||||
- ✅ 提示"裁判长可看见所有场地和项目"
|
||||
|
||||
### 滚动效果:
|
||||
- 流畅的横向滑动
|
||||
- 隐藏滚动条(更美观)
|
||||
- 支持触摸拖动
|
||||
- 支持点击切换
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术实现
|
||||
|
||||
### 横向滚动实现:
|
||||
使用 `<scroll-view>` 组件:
|
||||
```vue
|
||||
<scroll-view scroll-x="true" show-scrollbar="false">
|
||||
<!-- 内容 -->
|
||||
</scroll-view>
|
||||
```
|
||||
|
||||
### 数据结构:
|
||||
```javascript
|
||||
venues: [
|
||||
{ id: 1, name: '第一场地' },
|
||||
{ id: 2, name: '第二场地' },
|
||||
// ... 5个场地
|
||||
],
|
||||
projects: [
|
||||
'女子组长拳',
|
||||
'男子组陈氏太极拳',
|
||||
// ... 8个项目
|
||||
]
|
||||
```
|
||||
|
||||
### 样式要点:
|
||||
```css
|
||||
.venue-scroll,
|
||||
.project-scroll {
|
||||
width: 100%;
|
||||
white-space: nowrap; /* 防止换行 */
|
||||
}
|
||||
|
||||
.venue-tabs,
|
||||
.project-list {
|
||||
display: inline-flex; /* 内联flex布局 */
|
||||
gap: 20rpx; /* 间距 */
|
||||
}
|
||||
|
||||
.venue-tab,
|
||||
.project-btn {
|
||||
white-space: nowrap; /* 文字不换行 */
|
||||
flex-shrink: 0; /* 不收缩 */
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 后续可扩展功能
|
||||
|
||||
1. **动态加载场地和项目**
|
||||
- 可以从后端API获取场地列表
|
||||
- 可以根据比赛动态配置项目
|
||||
|
||||
2. **权限细化**
|
||||
- 可以增加更多角色(如主裁判、副裁判等)
|
||||
- 可以配置每个角色的具体权限
|
||||
|
||||
3. **评分记录**
|
||||
- 可以保存评分历史
|
||||
- 可以查看已评分的选手
|
||||
|
||||
4. **实时同步**
|
||||
- 可以实时同步评分结果
|
||||
- 可以实时更新选手状态
|
||||
|
||||
---
|
||||
|
||||
## ✨ 使用提示
|
||||
|
||||
1. 所有功能已在H5和小程序平台测试通过
|
||||
2. 横向滚动支持触摸和鼠标拖动
|
||||
3. 登录时邀请码不区分大小写(PUB 和 pub 效果相同)
|
||||
4. 所有数据目前为静态数据,实际使用需对接后端API
|
||||
|
||||
---
|
||||
|
||||
**祝您使用愉快!**
|
||||
111
如何运行.md
Normal file
111
如何运行.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# ⚠️ 重要:正确的运行方式
|
||||
|
||||
## ❌ 错误方式
|
||||
直接点击顶部菜单栏的"运行"菜单 → **会提示"浏览器运行尚不支持此种类型文件"**
|
||||
|
||||
## ✅ 正确方式
|
||||
|
||||
### 方法一:右键菜单运行(推荐)
|
||||
|
||||
1. **在左侧项目管理器中找到项目根目录**
|
||||
```
|
||||
项目管理器
|
||||
└─ martial-admin-mini ← 这是项目根目录(文件夹图标)
|
||||
├─ pages/
|
||||
├─ common/
|
||||
├─ App.vue
|
||||
├─ main.js
|
||||
└─ ...
|
||||
```
|
||||
|
||||
2. **右键点击** `martial-admin-mini` 这个文件夹名称
|
||||
|
||||
3. 在弹出菜单中选择:
|
||||
```
|
||||
运行(R) →
|
||||
运行到浏览器 →
|
||||
Chrome
|
||||
```
|
||||
|
||||
4. 等待编译完成,浏览器会自动打开
|
||||
|
||||
### 方法二:先选中后使用菜单栏
|
||||
|
||||
1. **单击左侧项目管理器中的项目根目录** `martial-admin-mini`
|
||||
- 确保它被选中(高亮显示)
|
||||
|
||||
2. 然后点击顶部菜单栏:
|
||||
```
|
||||
运行 → 运行到浏览器 → Chrome
|
||||
```
|
||||
|
||||
## 📝 详细操作图示
|
||||
|
||||
```
|
||||
HBuilderX界面布局:
|
||||
┌────────────────────────────────────────────────┐
|
||||
│ 文件 编辑 选择 运行(R) 工具 帮助 │ ← 菜单栏
|
||||
├──────────┬─────────────────────────────────────┤
|
||||
│项目管理器│ │
|
||||
│ │ │
|
||||
│📁 martial│ │
|
||||
│ -admin │ 编辑器区域 │
|
||||
│ -mini │ │
|
||||
│ ├📁pages│ │
|
||||
│ ├📁commo│ │
|
||||
│ ├📄App.v│ │
|
||||
│ └📄main.│ │
|
||||
│ │ │
|
||||
│ ↑ │ │
|
||||
│ 右键这里│ │
|
||||
└──────────┴─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 操作步骤总结
|
||||
|
||||
### 🎯 步骤1:定位项目根目录
|
||||
在左侧项目管理器中,找到 **martial-admin-mini** 文件夹
|
||||
|
||||
### 🎯 步骤2:右键点击
|
||||
**右键**点击项目名称 `martial-admin-mini`
|
||||
|
||||
### 🎯 步骤3:选择运行方式
|
||||
运行(R) → 运行到浏览器 → Chrome
|
||||
|
||||
### 🎯 步骤4:等待编译
|
||||
- 底部控制台会显示编译进度
|
||||
- 首次编译可能需要1-2分钟
|
||||
- 编译完成后会自动打开Chrome浏览器
|
||||
|
||||
## ⚡ 快捷键(可选)
|
||||
|
||||
选中项目根目录后,可以使用快捷键:
|
||||
- **Ctrl + R** - 打开运行菜单
|
||||
- 然后选择运行方式
|
||||
|
||||
## 🔍 验证是否选对位置
|
||||
|
||||
右键点击后,如果看到以下菜单,说明位置正确:
|
||||
```
|
||||
✓ 运行(R)
|
||||
├─ 运行到浏览器
|
||||
├─ 运行到小程序模拟器
|
||||
└─ 运行到手机或模拟器
|
||||
✓ 发行(U)
|
||||
✓ 重新编译
|
||||
✓ 重命名
|
||||
...
|
||||
```
|
||||
|
||||
如果没有看到"运行到浏览器",说明:
|
||||
- 可能点击的是某个文件而不是项目根目录
|
||||
- 或者项目未被正确识别为uni-app项目
|
||||
|
||||
## 🚀 现在开始
|
||||
|
||||
请按照上述步骤:
|
||||
1. 在左侧找到 `martial-admin-mini` 文件夹
|
||||
2. 右键点击这个文件夹
|
||||
3. 选择:运行 → 运行到浏览器 → Chrome
|
||||
|
||||
祝运行成功!
|
||||
Reference in New Issue
Block a user