add front file

main
方丽彤 1 month ago
parent 9372f6120a
commit c57f395dec

@ -0,0 +1,16 @@
{ // launch.json configurations app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtypelocalremote, localremote
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}

@ -0,0 +1,17 @@
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
</style>

@ -0,0 +1,167 @@
# 教师:随机点名且提问,学生:签到且回答
## 调用后端接口的代码
<template>
<view>
<view v-if="role === 'teacher'">
<button @click="randomCall" class="button">随机点名</button>
<button @click="askQuestion" class="button">发布问题: 1+1=</button>
</view>
<view class="list">
<view class="list-header">
<text>签到学生名单</text>
<text>状态</text>
</view>
<view v-for="(student, index) in selectedStudents" :key="index" class="list-item">
<text>{{ student.name }}</text>
<text>{{ student.signed ? '✔' : '' }}</text>
</view>
</view>
<view v-if="role === 'student'" class="button-container">
<button :disabled="!canSignIn" @click="signIn" class="button">签到</button>
<button @click="answerQuestion" class="button">回答问题: 1+1=</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
role: '', // 用户角色teacher 或 student从后端获取
currentStudent: 'jywsd', // 当前学生姓名
students: [
{ name: 'jywsd', signed: false },
{ name: 'sserjs', signed: false },
{ name: 'shsjsh', signed: false },
{ name: 'wwkks', signed: false }
],
selectedStudents: []
};
},
computed: {
canSignIn() {
// 判断当前学生是否在被点名的名单中
return this.selectedStudents.some(s => s.name === this.currentStudent);
}
},
methods: {
fetchUserRole() {
// 假设从后端获取用户信息
uni.request({
url: 'http://10.133.28.65:3000/api/students', // 替换为实际的后端接口
method: 'GET',
success: (res) => {
this.role = res.data.role; // 获取用户角色
}
});
},
randomCall() {
// 随机选择学生进行点名
let numberOfStudents = Math.floor(Math.random() * this.students.length) + 1;
this.selectedStudents = [...this.students]
.sort(() => 0.5 - Math.random())
.slice(0, numberOfStudents)
.map(student => ({ ...student, signed: false }));
},
signIn() {
// 学生签到逻辑
this.selectedStudents = this.selectedStudents.map(student => {
if (student.name === this.currentStudent) {
return { ...student, signed: true };
}
return student;
});
uni.showToast({
title: '签到完成',
icon: 'success'
});
},
askQuestion() {
// 教师发布问题
uni.showToast({
title: '问题已发布: 1+1=',
icon: 'none'
});
},
answerQuestion() {
// 学生回答问题
let answer = prompt("请输入你的答案: 1+1=");
if (answer === "2") {
uni.showToast({
title: '回答正确',
icon: 'success'
});
} else {
uni.showToast({
title: '回答错误',
icon: 'none'
});
}
}
},
created() {
this.fetchUserRole(); // 页面加载时获取用户角色
}
}
</script>
<style>
.button {
display: block;
width: 80%;
margin: 10px auto;
padding: 10px;
background-color: #1E90FF;
color: white;
text-align: center;
border-radius: 5px;
}
.button:disabled {
background-color: grey;
}
.list {
margin: 20px;
background-color: #f0f0f0;
padding: 10px;
}
.list-header, .list-item {
display: flex;
justify-content: space-between;
padding: 5px 0;
}
.button-container {
display: flex;
justify-content: center;
}
</style>
# rank调用
<script setup>
import { ref, onMounted } from 'vue';
const rankData = ref([]); // 定义 rankData 为响应式数据
const getStudents = async () => {
let res = await uni.request({
url: "http://10.133.60.255:3000/api/students",
});
if (res && res.data) {
rankData.value = res.data; // 假设返回的数据格式正确并赋值给 rankData
}
};
onMounted(() => {
getStudents(); // 组件挂载时调用获取学生数据的函数
});
</script>

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

@ -0,0 +1,22 @@
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif

@ -0,0 +1,82 @@
{
"name" : "randomcall",
"appid" : "__UNI__A58238D",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {},
/* */
"distribute" : {
/* android */
"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 */
"ios" : {
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {
"ad" : {}
},
"icons" : {
"android" : {
"xxhdpi" : "static/logo.png"
}
}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wx0874fe247e4282a3",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true,
"permission" : {}
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3"
}

@ -0,0 +1,123 @@
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "小课堂"
}
},
{
"path": "pages/shop/shop",
"style": {
"navigationBarTitleText": "商城"
}
},
{
"path": "pages/information/information",
"style": {
"navigationBarTitleText": "个人信息"
}
},
{
"path" : "pages/rank/rank",
"style" :
{
"navigationBarTitleText" : "排行榜"
}
},
{
"path" : "pages/rank/mine rank/mine rank",
"style" :
{
"navigationBarTitleText" : "我的排名"
}
},
{
"path" : "pages/index/question/question",
"style" :
{
"navigationBarTitleText" : "学生签到"
}
},
{
"path" : "pages/index/attendance/attendance",
"style" :
{
"navigationBarTitleText" : "随机点名"
}
},
{
"path" : "pages/login/zhuce/shenfen",
"style" :
{
"navigationBarTitleText" : "注册"
}
},
{
"path" : "pages/login/zhuce/register/register",
"style" :
{
"navigationBarTitleText" : "注册"
}
},
{
"path" : "pages/login/zhuce/register/teacher",
"style" :
{
"navigationBarTitleText" : "注册"
}
},
{
"path" : "pages/login/stulogin",
"style" :
{
"navigationBarTitleText" : "登录"
}
},
{
"path" : "pages/login/login",
"style" :
{
"navigationBarTitleText" : "登录"
}
}
],
"tabBar": {
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/home2.png",
"selectedIconPath": "static/home1.png"
},
{
"pagePath": "pages/shop/shop",
"text": "商城",
"iconPath": "static/shop2.png",
"selectedIconPath":"static/shop1.png"
},
{
"pagePath": "pages/rank/rank",
"text": "排行榜",
"iconPath":"static/rank2.png",
"selectedIconPath": "static/rank1.png"
},
{
"pagePath": "pages/information/information",
"text": "我的",
"iconPath": "static/my2.png",
"selectedIconPath": "static/my1.png"
}
]
},
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "小课堂",
"navigationBarBackgroundColor": "#f8f8f8",
"backgroundColor": "#f8f8f8"
}
}

@ -0,0 +1,190 @@
<template>
<view>
<!-- 文件上传输入框接受 Excel 文件 -->
<input type="file" accept=".xlsx, .xls" @change="handleFileUpload" class="file-input" />
<!-- 上传按钮 -->
<button @click="upload" class="button">上传名单</button>
<view>
<button @click="randomCall" class="button">随机点名</button>
</view>
<view class="list">
<view class="list-header">
<text class="list-left">签到学生名单</text>
<text class="list-mid">状态</text>
<text class="list-right">积分</text>
</view>
<view v-for="(student, index) in selectedStudents" :key="index" class="list-item">
<text class="item-left">{{ student.name }}</text>
<text class="item-mid">{{ student.signed ? '✔' : '' }}</text>
<text class="item-right">{{ student.points }}</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
//
const rcallData = ref([]);
const selectedStudents = ref([]);
const file = ref(null);
//
const handleFileUpload = (event) => {
file.value = event.target.files[0]; //
console.log("Selected file:", file.value); //
};
//
const upload = async () => {
if (!file.value) {
console.warn("请选择一个文件进行上传");
return;
}
const formData = new FormData();
formData.append('file', file.value);
console.log("FormData:", formData.get('file')); // FormData
try {
const response = await uni.request({
url: 'http://10.198.140.41:3000/api/upload',
method: 'POST',
header: {
'Content-Type': 'multipart/form-data'
},
data: formData
});
if (response.statusCode === 200) {
console.log('文件上传成功:', response.data);
rcallData.value = response.data; //
} else {
console.error('文件上传失败:', response.data);
}
} catch (error) {
console.error('上传过程中发生错误:', error);
}
};
//
const randomCall = async () => {
if (rcallData.value.length === 0) {
console.warn("没有学生数据可供点名");
return;
}
const studentCount = Math.floor(Math.random() * (30 - 20 + 1)) + 20;
const shuffledStudents = rcallData.value.sort(() => 0.5 - Math.random());
const selected = shuffledStudents.slice(0, Math.min(studentCount, rcallData.value.length));
selected.forEach(student => {
student.signed = true;
student.points += 1;
});
selectedStudents.value = selected;
await Promise.all(selected.map(student => sendAttendance(student)));
};
const sendAttendance = async (student) => {
try {
const response = await uni.request({
url: "http://10.198.140.41:3000/api/upload",
method: 'PUT',
data: {
name: student.name,
points: student.points
},
header: {
'Content-Type': 'application/json'
}
});
if (response.statusCode === 200) {
console.log('Attendance updated successfully:', response.data);
} else {
console.error('Failed to update attendance:', response.data);
}
} catch (error) {
console.error('Error occurred while updating attendance:', error);
}
};
</script>
<style scoped>
.button {
display: block;
width: 80%;
height: 60px;
margin: 10px auto;
padding: 10px;
background-color: #1E90FF;
color: white;
text-align: center;
border-radius: 5px;
}
.list {
margin: 20px;
background-color: #f9f9f9;
border-bottom: 1px solid #ccc;
padding: 10px;
}
.list-header {
display: flex;
justify-content: space-between;
}
.list-left {
flex-grow: 2;
}
.list-mid {
text-align: center;
flex-grow: 1;
}
.list-right {
padding-left: 15px;
padding-right: 8px;
}
.list-item {
display: flex;
justify-content: space-between;
padding: 5px 0;
}
.item-left {
font-size: 32rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: left;
flex: 6;
}
.item-mid {
text-align: center;
padding-left: 60px;
padding-right: 45px;
flex: 1;
}
.item-right {
text-align: center;
padding-right: 10px;
flex: 1;
}
.button-container {
display: flex;
justify-content: center;
}
</style>

@ -0,0 +1,94 @@
<template>
<view>
<view class="begin">我的班级</view>
<view class="page-body">
<view class="btn-area">
<navigator url="/pages/index/question/question" hover-class="navigator-hover">
<button type="default" class="btn-with-icon">
<view class="btn-content">
<image class="btn-icon" src='../../static/class1.png'></image>
<view class="shangke">上课次数9</view>
</view>
<view class="btn-text">签到模拟</view>
<image src='../../static/forw.png' class="forward-icon"></image>
</button>
</navigator>
<navigator url="/pages/index/attendance/attendance" hover-class="navigator-hover">
<button type="default" class="btn-with-icon">
<view class="btn-content">
<image class="btn-icon" src='../../static/class2.png'></image>
<view class="shangke">上课次数5</view>
</view>
<view class="btn-text">点名模拟</view>
<image src='../../static/forw.png' class="forward-icon"></image>
</button>
</navigator>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {}
},
methods: {}
}
</script>
<style>
.begin{
font-size: 38rpx;
font-weight: bold;
margin-top: 10px;
margin-bottom: 10px;
margin-left: 8px;
}
.page-body {
display: flex;
justify-content: center;
}
.btn-area {
width: 90%;
height: 320rpx;
}
.btn-with-icon {
height: 95px;
padding-left: 10rpx;
border-radius: 5px;
display: flex;
align-items: center; /* 使内容在垂直方向上居中 */
justify-content: space-between; /* 图标与文本分开并推到两端 */
margin-bottom: 18px; /* 在每个按钮之间添加间隔 */
}
.btn-content {
display: flex;
flex-direction: column; /* 垂直排列 */
align-items: flex-start; /* 靠左对齐 */
}
.btn-icon {
width: 50rpx;
height: 50rpx;
margin-top: 20rpx;
margin-bottom: 5rpx; /* 图标和上课次数之间的间距 */
}
.shangke {
font-size: 12px;
margin-top: auto; /* 将上课次数推到底部 */
}
.btn-text {
text-align: left; /* 文字水平靠左 */
font-size: 40rpx;
margin-left: 60rpx; /* 根据需要调整左边距,以使其与图标齐平 */
margin-top: 0; /* 可根据需要调整上边距 */
}
.forward-icon {
width: 32rpx;
height: 32rpx;
margin-left: auto; /* 推到右侧 */
}
</style>

@ -0,0 +1,207 @@
<template>
<view>
<!-- 问题容器只有在 question 存在时才显示 -->
<view class="question-container" v-if="question">
<text>问题: {{ question }}</text>
<!-- 用户输入答案的输入框 -->
<input v-model="studentAnswer" placeholder="请输入你的答案" class="answer-input" />
<!-- 提交答案 -->
<button @click="checkAnswer" class="button">提交答案</button>
</view>
<view class="txzz">
<button @click="selectRandomStudent" style="width: 320px;">
<text>天选之子{{ selectedStudent?.name || '点击选择' }}</text>
</button>
<text v-if="selectedStudent">: {{ selectedStudent.points }}</text>
</view>
<!-- 签到 -->
<view class="atten">
<button @click="signIn" class="button">签到</button>
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const studentAnswer = ref('');
const question = ref('');
const correctAnswer = ref('');
const rcallData = ref([]); //
const selectedStudent = ref(null); //
const fetchQuestion = async () => {
try {
const res = await uni.request({
url: 'http://10.198.140.41:3000/api/questions',
method: 'GET'
});
if (res.statusCode === 200 && res.data.length > 0) {
const questionData = res.data[0];
question.value = questionData.question;
correctAnswer.value = questionData.correctAnswer;
} else {
console.error('获取问题失败:', res);
uni.showToast({ title: '无法获取问题', icon: 'none' });
}
} catch (error) {
console.error('请求时发生错误:', error);
uni.showToast({ title: '网络错误', icon: 'none' });
}
};
const getans = async () => {
try {
let res = await uni.request({
url: "http://10.198.140.41:3000/api/upload",
method: 'GET',
});
if (res && res.data) {
rcallData.value = res.data.map(student => ({
name: student.name,
points: student.points || 0
}));
console.log(rcallData.value);
}
} catch (error) {
console.error("获取学生数据失败:", error);
}
};
const selectRandomStudent = () => {
if (rcallData.value.length === 0) {
uni.showToast({
title: '没有学生数据',
icon: 'none'
});
return;
}
const randomIndex = Math.floor(Math.random() * rcallData.value.length);
selectedStudent.value = rcallData.value[randomIndex];
};
const checkAnswer = async () => {
if (!selectedStudent.value) {
uni.showToast({
title: '请先选择天选之子',
icon: 'none'
});
return;
}
if (studentAnswer.value.trim() === '') {
uni.showToast({
title: '请输入答案',
icon: 'none'
});
return;
}
if (studentAnswer.value === correctAnswer.value) {
selectedStudent.value.points += 2;
uni.showToast({
title: '回答正确',
icon: 'success'
});
} else {
selectedStudent.value.points -= 1;
uni.showToast({
title: '回答错误',
icon: 'none'
});
}
studentAnswer.value = '';
await sendAttendance(selectedStudent.value);
};
const signIn = () => {
if (selectedStudent.value) {
selectedStudent.value.points += 1;
uni.showToast({
title: '签到成功',
icon: 'success'
});
}
};
const sendAttendance = async (student) => {
try {
const response = await uni.request({
url: "http://10.198.140.41:3000/api/upload",
method: 'POST',
data: {
name: student.name,
points: selectedStudent.value.points
},
header: {
'Content-Type': 'application/json'
}
});
if (response.statusCode === 200) {
console.log('Attendance updated successfully:', response.data);
} else {
console.error('Failed to update attendance:', response.data);
}
} catch (error) {
console.error('Error occurred while updating attendance:', error);
}
};
onMounted(() => {
fetchQuestion();
getans();
});
</script>
<style scoped>
.button {
display: block;
width: 320px;
height: 60px;
margin: 10px auto;
padding: 10px;
margin-top: 25px;
background-color: #1E90FF;
color: white;
text-align: center;
border-radius: 5px;
}
.answer-input {
width: 90%;
padding: 10px;
margin: 10px auto;
border: 1px solid #ccc;
border-radius: 5px;
}
.question-container {
display: flex;
flex-direction: column;
align-items: center;
margin: 20px;
padding: 10px;
}
.txzz {
display: flex;
flex-direction: column;
align-items: center;
}
.atten {
display: flex;
align-content: center;
bottom: 40px;
}
</style>

@ -0,0 +1,137 @@
<template>
<view class="header">
<navigator url="/pages/login/login">
<image src="../../static/exit.png" class="exit" style="height: 32px;width: 32px;"></image>
</navigator>
</view>
<view class="profile-container">
<!-- Static Avatar -->
<navigator url="/pages/login/login">
<view class="avatar-display">
<image src='../../static/ava.png' mode="aspectFit" class="avatar-image" />
</view>
</navigator>
<!-- Editable Personal Information -->
<view class="form">
<view class="input-group">
<text class="label">姓名</text>
<input v-model="name" class="info-input" />
</view>
<view class="input-group">
<text class="label">学号</text>
<input v-model="studentId" class="info-input" />
</view>
<view class="input-group">
<text class="label">班级</text>
<input v-model="className" class="info-input" />
</view>
<view class="input-group">
<text class="label">年龄</text>
<input v-model="age" class="info-input" />
</view>
<view class="input-group">
<text class="label">专业</text>
<input v-model="major" class="info-input" />
</view>
<button @click="saveInfo" class="save-button">保存信息</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
name: '',
studentId: '',
className: '',
age: '',
major: ''
};
},
methods: {
saveInfo() {
// Logic to save the information
uni.showToast({
title: '信息已保存',
icon: 'success'
});
}
}
};
</script>
<style scoped>
.header{
display: flex;
justify-content: right;
margin: 10px 10px;
}
.exit{
font-weight: bold;
cursor: pointer;
}
.profile-container {
padding: 20px;
}
.avatar-display {
margin-top: 20px;
display: flex;
justify-content: center;
margin-bottom: 20px;
}
.avatar-image {
width: 100px;
height: 100px;
border-radius: 50%;
}
.form {
margin-top: 40px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.input-group {
margin-bottom: 15px;
width: 90%;
}
.label {
font-weight: bold;
}
.info-input {
margin: 5px auto;
border: 1px solid #ccc;
padding: 5px;
border-radius: 4px;
}
.info {
margin-left: 5px;
}
.save-button {
margin-top: 30px;
background-color: #1E90FF;
width: 320px;
height: 60px;
color: white;
padding: 10px;
border: none;
border-radius: 5px;
text-align: center;
}
</style>

@ -0,0 +1,169 @@
<template>
<view class="login-container">
<!-- Login Form -->
<view class="form">
<view class="input-group">
<text class="icon">👤</text>
<input class="input" v-model="form.username" placeholder="请输入账号" />
</view>
<view class="input-group">
<text class="icon">🔒</text>
<input class="input" v-model="form.password" type="password" placeholder="请输入密码" />
</view>
</view>
<!-- Buttons -->
<button class="login-button" @click="login"></button>
<button class="register-button" @click="navigateToRegister"></button>
</view>
</template>
<script setup>
import { ref } from 'vue';
const form = ref({
username: '',
password: ''
});
const loginData = ref([]);
const navigateToRegister = () => {
uni.navigateTo({
url: '/pages/login/zhuce/shenfen',
success: res => {
console.log("成功跳转到注册页面");
},
fail: err => {
console.error("跳转失败:", err);
}
});
}
const login = async () => {
try {
let res = await uni.request({
url: "http://10.198.140.41:3000/api/teacher/login",
method: 'POST',
header: {
'Content-Type': 'application/json' // JSON
},
data: {
username: form.value.username,
password: form.value.password
},
});
console.log("响应数据:", res.data); //
console.log("登录信息:",form.value);
if (res && res.data) {
loginData.value = res.data; //
if(res.data.message === "登录成功"){
uni.switchTab({
url:"/pages/index/index"/* 跳转到导航栏页面 */
})
console.log("登录成功!");
}
}
} catch (error) {
console.error("登录请求失败:", error); //
}
};
</script>
<style scoped>
.login-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
height: 760px;
}
.title {
font-size: 30px;
font-weight: bold;
}
.subtitle {
font-size: 16px;
margin-top: 10px;
}
.form {
width: 100%;
max-width: 300px;
margin-bottom: 20px;
margin-top: 140px;
}
.input-group {
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
display: flex;
align-items: center;
height: 36px;
margin-bottom: 15px;
background-color: white;
border-radius: 25px;
padding: 10px;
}
.icon {
margin-right: 10px;
font-size: 18px;
}
.input {
flex: 1;
border: none;
outline: none;
}
.login-button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
max-width: 300px;
padding: 10px;
height: 48px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 25px;
text-align: center;
margin-bottom: 10px;
}
.register-button {
display: flex;
align-items: center;
justify-content: center;
height: 48px;
width: 100%;
max-width: 300px;
padding: 10px;
background-color: transparent;
color: #4CAF50;
border: 1px solid #4CAF50;
border-radius: 25px;
text-align: center;
}
.error-message {
color: red;
margin-top: 20px;
}
</style>

@ -0,0 +1,164 @@
<template>
<view class="login-container">
<!-- Login Form -->
<view class="form">
<view class="input-group">
<text class="icon">👤</text>
<input class="input" v-model="form.studentId" placeholder="请输入账号" />
</view>
<view class="input-group">
<text class="icon">🔒</text>
<input class="input" v-model="form.password" type="password" placeholder="请输入密码" />
</view>
</view>
<!-- Buttons -->
<button class="login-button" @click="login"></button>
<button class="register-button" @click="navigateToRegister"></button>
</view>
</template>
<script setup>
import { ref } from 'vue';
const form = ref({
studentId: '',
password: ''
});
const loginData = ref([]);
const navigateToRegister = () => {
uni.navigateTo({
url: '/pages/login/zhuce/shenfen',
success: res => {
console.log("成功跳转到注册页面");
},
fail: err => {
console.error("跳转失败:", err);
}
});
}
const login = async () => {
try {
let res = await uni.request({
url: "http://10.198.140.41:3000/api/students/login",
method: 'POST',
header: {
'Content-Type': 'application/json' // JSON
},
data: {
studentId: form.value.studentId,
password: form.value.password
},
});
console.log("响应数据:", res.data); //
if (res && res.data) {
loginData.value = res.data; //
if(res.data.message === "登录成功"){
console.log("登录成功!");
uni.switchTab({
url:"/pages/index/index"
})
}
}
} catch (error) {
console.error("登录请求失败:", error); //
}
};
</script>
<style scoped>
.login-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
height: 760px;
}
.title {
font-size: 30px;
font-weight: bold;
}
.subtitle {
font-size: 16px;
margin-top: 10px;
}
.form {
width: 100%;
max-width: 300px;
margin-bottom: 20px;
margin-top: 140px;
}
.input-group {
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
display: flex;
align-items: center;
height: 36px;
margin-bottom: 15px;
background-color: white;
border-radius: 25px;
padding: 10px;
}
.icon {
margin-right: 10px;
font-size: 18px;
}
.input {
flex: 1;
border: none;
outline: none;
}
.login-button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
max-width: 300px;
padding: 10px;
height: 48px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 25px;
text-align: center;
margin-bottom: 10px;
}
.register-button {
display: flex;
align-items: center;
justify-content: center;
height: 48px;
width: 100%;
max-width: 300px;
padding: 10px;
background-color: transparent;
color: #4CAF50;
border: 1px solid #4CAF50;
border-radius: 25px;
text-align: center;
}
.error-message {
color: red;
margin-top: 20px;
}
</style>

@ -0,0 +1,175 @@
<template>
<view class="login-container">
<!-- Login Form -->
<view class="form">
<view class="input-group">
<text class="icon">👤</text>
<input class="input" v-model="form.name" placeholder="请输入账号" />
</view>
<view class="input-group">
<text class="icon"></text>
<input class="input" v-model="form.studentId" placeholder="请输入学号" />
</view>
<view class="input-group">
<text class="icon">🔒</text>
<input class="input" v-model="form.password" type="password" placeholder="请输入密码" />
</view>
<view class="input-group">
<text class="icon">🔒</text>
<input class="input" v-model="form.confirmPassword" type="password" placeholder="确认输入密码" />
</view>
</view>
<!-- Buttons -->
<button class="login-button" @click="register"></button>
</view>
</template>
<script setup>
import { ref } from 'vue';
const form = ref({
name: '',
studentId:'',
password: '',
confirmPassword: ''
});
const registerData = ref([]);
const register = async () => {
if (!form.value.name || !form.value.password || !form.value.confirmPassword || !form.value.studentId) {
console.error("请填写所有字段");
return;
}
if (form.value.password !== form.value.confirmPassword) {
console.error("密码和确认密码不一致");
return;
}
console.log("注册信息:", form.value); //
try {
let res = await uni.request({
url: "http://10.198.140.41:3000/api/students/register",
method: "POST",
header: {
"Content-Type": "application/json", // JSON
},
data: { //
name: form.value.name,
studentId: form.value.studentId,
password: form.value.password,
confirmPassword: form.value.confirmPassword,
},
});
console.log("响应数据:", res.data);
if (res && res.data) {
registerData.value = res.data;
if (res.data.message === "注册成功,欢迎同学") {
console.log("注册成功!");
uni.navigateTo({
url: "/pages/login/stulogin",
});
}
}
} catch (error) {
console.error("注册失败:", error.response ? error.response.data : error);
}
}
</script>
<style scoped>
.login-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
height: 760px;
}
.title {
font-size: 30px;
font-weight: bold;
}
.subtitle {
font-size: 16px;
margin-top: 10px;
}
.form {
width: 100%;
max-width: 300px;
margin-bottom: 20px;
margin-top: 140px;
}
.input-group {
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
display: flex;
align-items: center;
height: 36px;
margin-bottom: 15px;
background-color: white;
border-radius: 25px;
padding: 10px;
}
.icon {
margin-right: 10px;
font-size: 18px;
}
.input {
flex: 1;
border: none;
outline: none;
}
.login-button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
max-width: 300px;
padding: 10px;
height: 48px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 25px;
text-align: center;
margin-bottom: 10px;
}
.register-button {
display: flex;
align-items: center;
justify-content: center;
height: 48px;
width: 100%;
max-width: 300px;
padding: 10px;
background-color: transparent;
color: #4CAF50;
border: 1px solid #4CAF50;
border-radius: 25px;
text-align: center;
}
.error-message {
color: red;
margin-top: 20px;
}
</style>

@ -0,0 +1,169 @@
<template>
<view class="login-container">
<!-- Login Form -->
<view class="form">
<view class="input-group">
<text class="icon">👤</text>
<input class="input" v-model="form.username" placeholder="请输入账号" />
</view>
<view class="input-group">
<text class="icon">🔒</text>
<input class="input" v-model="form.password" type="password" placeholder="请输入密码" />
</view>
<view class="input-group">
<text class="icon">🔒</text>
<input class="input" v-model="form.confirmPassword" type="password" placeholder="确认输入密码" />
</view>
</view>
<!-- Buttons -->
<button class="login-button" @click="register"></button>
</view>
</template>
<script setup>
import { ref } from 'vue';
const form = ref({
username: '',
password: '',
confirmPassword: ''
});
const registerData = ref([]);
const register = async () => {
if (!form.value.username || !form.value.password || !form.value.confirmPassword) {
console.error("请填写所有字段");
return;
}
if (form.value.password !== form.value.confirmPassword) {
console.error("密码和确认密码不一致");
return;
}
console.log("注册信息:", form.value); //
try {
let res = await uni.request({
url: "http://10.198.140.41:3000/api/teacher/register",
method: "POST",
header: {
"Content-Type": "application/json", // JSON
},
data: {
username: form.value.username,
password: form.value.password,
confirmPassword: form.value.confirmPassword,
},
});
console.log("响应数据:", res.data);
if (res && res.data) {
registerData.value = res.data;
if (res.data.message === "注册成功,欢迎老师") {
console.log("注册成功!");
uni.navigateTo({
url: '/pages/login/login',
});
}
}
} catch (error) {
console.error("注册失败:", error.response ? error.response.data : error);
}
}
</script>
<style scoped>
.login-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
height: 760px;
}
.title {
font-size: 30px;
font-weight: bold;
}
.subtitle {
font-size: 16px;
margin-top: 10px;
}
.form {
width: 100%;
max-width: 300px;
margin-bottom: 20px;
margin-top: 140px;
}
.input-group {
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
display: flex;
align-items: center;
height: 36px;
margin-bottom: 15px;
background-color: white;
border-radius: 25px;
padding: 10px;
}
.icon {
margin-right: 10px;
font-size: 18px;
}
.input {
flex: 1;
border: none;
outline: none;
}
.login-button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
max-width: 300px;
padding: 10px;
height: 48px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 25px;
text-align: center;
margin-bottom: 10px;
}
.register-button {
display: flex;
align-items: center;
justify-content: center;
height: 48px;
width: 100%;
max-width: 300px;
padding: 10px;
background-color: transparent;
color: #4CAF50;
border: 1px solid #4CAF50;
border-radius: 25px;
text-align: center;
}
.error-message {
color: red;
margin-top: 20px;
}
</style>

@ -0,0 +1,77 @@
<template>
<view class="container">
<!-- Teacher Section -->
<navigator url="/pages/login/zhuce/register/teacher">
<view class="section">
<image src='../../../static/teacher.png' mode="aspectFit" class="identity-image" />
<button class="identity-button" @click="selectIdentity('teacher')"></button>
</view>
</navigator>
<view class="divider"></view>
<!-- Student Section -->
<navigator url="/pages/login/zhuce/register/register">
<view class="section">
<image src='../../../static/student.png' mode="aspectFit" class="identity-image" />
<button class="identity-button" @click="selectIdentity('student')"></button>
</view>
</navigator>
</view>
</template>
<script>
export default {
methods: {
selectIdentity(identity) {
// Record the identity (e.g., store in local storage or state management)
uni.setStorageSync('selectedIdentity', identity);
}
}
}
</script>
<style>
.container {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
justify-content: flex-start; /* 更改为向上对齐 */
padding-top: 100px; /*
padding-bottom: 20px; /* 可选:保持底部间距 */
}
.section {
display: flex;
flex-direction: column;
align-items: center;
margin: 20px 0;
}
.identity-image {
width: 120px;
height: 120px;
margin-bottom: 20px;
}
.identity-button {
width: 150px;
padding: 5px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 25px;
text-align: center;
}
.divider {
width: 80%;
height: 1px;
background-color: #ccc;
margin: 20px 0;
}
</style>

@ -0,0 +1,94 @@
<template>
<view class="container">
<view class="circle">
<text class="total-points">{{ totalPoints }}</text>
<text class="points-label">总积分</text>
</view>
<view class="stats">
<view class="stat-item">
<text>签到次数:</text>
<text class="count">{{ signInCount }}</text>
</view>
<view class="stat-item">
<text>回答问题次数: </text>
<text class="count">{{Answers}}</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
signInCount: 0, //
Answers: 0, //
}
},
computed:{
totalPoints(){
return this.signInCount*2+this.Answers*3;
}
}
}
</script>
<style>
.container {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
}
.circle {
width: 160px; /* 圆圈宽度 */
height: 160px; /* 圆圈高度 */
border-radius: 50%; /* 圆形 */
background-color: dodgerblue; /* 圆圈背景色 */
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-bottom: 40rpx; /* 圆圈与下方内容的间距 */
}
.total-points {
display: flex;
justify-content: center;
align-items: center;
font-size: 38px; /* 积分字体大小 */
font-style: italic;
font-weight: bold; /* 粗体 */
padding-right: 12px;
}
.points-label {
font-size: 18px; /* 标签字体大小 */
padding-top: 8rpx;
}
.stats {
margin-top: 20px;
display: flex;
flex-direction: column;
width: 100%; /* 适应父容器宽度 */
}
.stat-item {
display: flex;
justify-content: space-between; /* 左右对齐 */
align-items: center;
font-size: 18px; /* 统计项字体大小 */
margin-bottom: 20px; /* 项间距 */
padding: 0 16px; /* 左右内边距 */
border-bottom: 1px solid #eee;
}
.count {
font-style: italic;
font-weight: 550;
margin-left: auto;
}
</style>

@ -0,0 +1,181 @@
<template>
<view class="rrpage">
<view class="rtop-nav">
<view class="rtop-left">姓名</view>
<view class="rtop-scole">积分</view>
<view class="rtop-rank">名次</view>
</view>
<view class="rrpage-body">
<view class="rank-list">
<view class="rank-item" v-for="(item, index) in rankData" :key="index">
<view class="rank-info rank-name">
<text>{{ item.name }}</text>
</view>
<view class="rank-info rank-score">
<text>{{ item.score }}</text>
</view>
<view class="rank-info rank-position">
<text>{{ index + 1 }}</text>
</view>
</view>
</view>
</view>
<navigator url="mine rank/mine rank" hover-class="navigator-hover">
<view class="rbtn-area">我的排名</view>
</navigator>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const rankData = ref([]); // rankData
const getStudents = async () => {
try {
let res = await uni.request({
url: "http://10.198.140.41:3000/api/upload",
method: 'GET', //
});
if (res && res.data) {
// rankData
rankData.value = res.data.map(student => ({
name: student.name,
score: student.points
}));
// score
rankData.value.sort((a, b) => b.score - a.score);
}
} catch (error) {
console.error("获取学生数据失败:", error); //
}
};
onMounted(() => {
getStudents(); //
});
</script>
<style scoped>
.rrpage {
display: flex;
flex-direction: column; /* 垂直方向排列 */
}
.rtop-nav {
display: flex;
flex-direction: row;
position: fixed; /* 固定定位 */
top: 0; /* 微信小程序处改为0 */
width: 100%; /* 宽度为100% */
height: 80rpx;
background-color: #f9f9f9; /* 背景色 */
border-bottom: 1px solid #ccc; /* 边框 */
font-size: 36rpx;
font-weight: bold;
justify-content: space-between; /* 两端对齐 */
}
.rtop-left {
padding-left: 45rpx;
flex-grow: 1; /* 让这个区域可扩展 */
}
.rtop-scole {
text-align: center; /* 中间对齐 */
padding-right: 40px;
flex-grow: 1;
}
.rtop-rank {
padding-right: 20px;
}
.rtop-left {
text-align: left; /* 姓名列靠左 */
}
.rtop-scole,.rtop-rank{
text-align: right;
}
.rrpage-body {
width: 100%;
margin-top: 70rpx;
margin-bottom: 30rpx;
flex-direction: column;
}
.rank-list {
display: flex;
flex-direction: column;
overflow-y: auto; /* 允许纵向滚动 */
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
background-color: white;
}
.rank-item {
display: flex;
flex-direction: row; /* 水平方向排列 */
padding: 10px;
border-bottom: 1px solid #eee;
justify-content: space-between; /* 两端对齐 */
}
.rank-item:last-child {
border-bottom: none;
}
.rank-info {
display: flex;
align-items: center; /* 垂直居中对齐 */
}
.rank-name {
font-size: 32rpx;
overflow: hidden; /* 防止溢出 */
text-overflow: ellipsis; /* 溢出时显示省略号 */
white-space: nowrap; /* 不换行 */
text-align: left; /* 姓名列靠左 */
flex: 6;
}
.rank-score{
text-align: center; /* 中间对齐 */
padding-left: 110px;
flex: 1;
}
.rank-position{
text-align: center;
padding-left: 55px;
flex:1;
}
.rank-score, .rank-position {
font-size: 36rpx;
}
.rbtn-area {
position: fixed; /* 固定定位 */
bottom: 0; /* 微信改为0 */
left: 0; /* 从左侧开始 */
width: 100%; /* 宽度为100% */
height: 36px;
background-color: dodgerblue;
text-align: center; /* 文本居中 */
border-top: 1px solid #ccc; /* 顶部边框 */
padding: 10px 0; /* 内边距 */
font-size: 38rpx;
}
.navigator {
display: inline-block; /* 确保按钮显示正常 */
}
</style>

@ -0,0 +1,93 @@
<template>
<view class="product-list">
<h2>可用积分: {{ availablePoints }} 积分</h2> <!-- 显示用户的可用积分 -->
<!-- 遍历产品列表生成每个产品的显示 -->
<view v-for="(product, index) in products" :key="index" class="product-item">
<h2>{{ product.name }}</h2> <!-- 产品名称 -->
<p class="shop-pri">
<span style="font-size: 48rpx;color: firebrick;font-weight:bold;margin-left: auto;">{{ product.price }}</span>
<span style="align-items: center;padding-left: 10rpx;" >积分</span>
</p> <!-- 产品价格 -->
<!-- 产品描述 -->
<p>介绍: {{ product.description }}</p>
<!-- 确认购买按钮点击时调用 confirmPurchase 方法 -->
<view class="shop-btn">
<button @click="confirmPurchase(product)"></button>
</view>
<!-- 显示购买后的消息 -->
<view v-if="product.message" class="message">{{ product.message }}</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
availablePoints: 140, //
products: [
{ name: '提问转移', price: 25, description: '该商品允许用户将自己的提问转移到其他用户', message: '' }, // 1
{ name: '免密钥签到', price: 50, description: '购买此商品后,用户可以享受一次免密钥签到服务', message: '' }, // 2
{ name: '成绩+1', price: 200, description: '购买此商品后,用户可以获得额外的分数', message: '' }, // 3
],
};
},
methods: {
confirmPurchase(product) {
//
if (product.price > this.availablePoints) {
product.message = '积分不足,无法购买该商品!'; //
} else {
//
this.availablePoints -= product.price;
//
product.message = `购买成功!${product.name} 已购买,消耗 ${product.price} 积分。`; //
}
},
},
};
</script>
<style scoped>
.product-list {
max-width: 600px; /* 设置产品列表的最大宽度 */
margin: auto; /* 水平居中 */
padding: 20px; /* 内边距 */
background: #fff; /* 背景颜色 */
border-radius: 5px; /* 圆角 */
}
.product-item {
margin-bottom: 15px; /* 将下边距稍微减少 */
padding: 10px; /* 内边距 */
border: 1px solid #ddd; /* 边框颜色 */
border-radius: 5px; /* 圆角 */
}
.shop-pri {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
margin-top: 5px; /* 增加顶部边距以缩小产品名称和价格之间的距离 */
}
.message {
margin-top: 10px; /* 上边距 */
color: green; /* 字体颜色 */
font-weight: bold; /* 加粗字体 */
}
.shop-btn {
margin-top: 20rpx;
}
</style>

@ -0,0 +1,28 @@
{
"appid": "wx0874fe247e4282a3",
"compileType": "miniprogram",
"libVersion": "3.5.8",
"packOptions": {
"ignore": [],
"include": []
},
"setting": {
"coverView": true,
"es6": true,
"postcss": true,
"minified": true,
"enhance": true,
"showShadowRootInWxmlPanel": true,
"packNpmRelationList": [],
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
}
},
"condition": {},
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
}
}

@ -0,0 +1,7 @@
{
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"projectname": "miniapp-demo1",
"setting": {
"compileHotReLoad": true
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 914 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,10 @@
uni.addInterceptor({
returnValue (res) {
if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
return res;
}
return new Promise((resolve, reject) => {
res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
});
},
});

@ -0,0 +1,76 @@
/**
* uni-app
*
* uni-app https://ext.dcloud.net.cn使
* 使scss使 import 便App
*
*/
/**
* App使
*
* 使scss scss 使 import
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//
$uni-text-color-inverse:#fff;//
$uni-text-color-grey:#999;//
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//
/* 边框颜色 */
$uni-border-color:#c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm:12px;
$uni-font-size-base:14px;
$uni-font-size-lg:16px;
/* 图片尺寸 */
$uni-img-size-sm:20px;
$uni-img-size-base:26px;
$uni-img-size-lg:40px;
/* Border Radius */
$uni-border-radius-sm: 2px;
$uni-border-radius-base: 3px;
$uni-border-radius-lg: 6px;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 5px;
$uni-spacing-row-base: 10px;
$uni-spacing-row-lg: 15px;
/* 垂直间距 */
$uni-spacing-col-sm: 4px;
$uni-spacing-col-base: 8px;
$uni-spacing-col-lg: 12px;
/* 透明度 */
$uni-opacity-disabled: 0.3; //
/* 文章场景相关 */
$uni-color-title: #2C405A; //
$uni-font-size-title:20px;
$uni-color-subtitle: #555555; //
$uni-font-size-subtitle:26px;
$uni-color-paragraph: #3F536E; //
$uni-font-size-paragraph:15px;

@ -0,0 +1 @@
https://app.liuyingyong.cn/build/download/55093ea0-877a-11ef-a4a5-2b5b6ba7f9cb

@ -0,0 +1 @@
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

@ -0,0 +1,3 @@
andrCertfile=D:/miniApp/HBuilderX.4.24.2024072208/HBuilderX/plugins/app-safe-pack/Test.keystore
andrCertAlias=android
andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>View</title>
<link rel="stylesheet" href="app.css" />
<script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
</head>
<body>
<div id="app"></div>
<script src="uni-app-view.umd.js"></script>
</body>
</html>

@ -0,0 +1,11 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#f8f8f8","navigationBar":{"backgroundColor":"#f8f8f8","titleText":"小课堂","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"randomcall","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.24","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"tabBar":{"position":"bottom","color":"#999","selectedColor":"#007aff","borderStyle":"black","blurEffect":"none","fontSize":"10px","iconWidth":"24px","spacing":"3px","height":"50px","list":[{"pagePath":"pages/index/index","text":"首页","iconPath":"/static/home2.png","selectedIconPath":"/static/home1.png"},{"pagePath":"pages/shop/shop","text":"商城","iconPath":"/static/shop2.png","selectedIconPath":"/static/shop1.png"},{"pagePath":"pages/rank/rank","text":"排行榜","iconPath":"/static/rank2.png","selectedIconPath":"/static/rank1.png"},{"pagePath":"pages/information/information","text":"我的","iconPath":"/static/my2.png","selectedIconPath":"/static/my1.png"}],"selectedIndex":0,"shown":true},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"isTabBar":true,"tabBarIndex":0,"navigationBar":{"titleText":"小课堂","type":"default"},"isNVue":false}},{"path":"pages/shop/shop","meta":{"isQuit":true,"isTabBar":true,"tabBarIndex":1,"navigationBar":{"titleText":"商城","type":"default"},"isNVue":false}},{"path":"pages/information/information","meta":{"isQuit":true,"isTabBar":true,"tabBarIndex":3,"navigationBar":{"titleText":"个人信息","type":"default"},"isNVue":false}},{"path":"pages/rank/rank","meta":{"isQuit":true,"isTabBar":true,"tabBarIndex":2,"navigationBar":{"titleText":"排行榜","type":"default"},"isNVue":false}},{"path":"pages/rank/mine rank/mine rank","meta":{"navigationBar":{"titleText":"我的排名","type":"default"},"isNVue":false}},{"path":"pages/index/question/question","meta":{"navigationBar":{"titleText":"学生签到","type":"default"},"isNVue":false}},{"path":"pages/index/attendance/attendance","meta":{"navigationBar":{"titleText":"随机点名","type":"default"},"isNVue":false}},{"path":"pages/login/zhuce/shenfen","meta":{"navigationBar":{"titleText":"注册","type":"default"},"isNVue":false}},{"path":"pages/login/zhuce/register/register","meta":{"navigationBar":{"titleText":"注册","type":"default"},"isNVue":false}},{"path":"pages/login/zhuce/register/teacher","meta":{"navigationBar":{"titleText":"注册","type":"default"},"isNVue":false}},{"path":"pages/login/stulogin","meta":{"navigationBar":{"titleText":"登录","type":"default"},"isNVue":false}},{"path":"pages/login/login","meta":{"navigationBar":{"titleText":"登录","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:16})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:u,window:u,document:u,frames:u,self:u,location:u,navigator:u,localStorage:u,history:u,Caches:u,screen:u,alert:u,confirm:u,prompt:u,fetch:u,XMLHttpRequest:u,WebSocket:u,webkit:u,print:u}}}});
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
{"@platforms":["android","iPhone","iPad"],"id":"__UNI__A58238D","name":"randomcall","version":{"name":"1.0.0","code":"100"},"description":"","developer":{"name":"","email":"","url":""},"permissions":{"UniNView":{"description":"UniNView原生渲染"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"autoclose":true,"delay":0,"target":"id:1","waiting":true},"popGesture":"close","launchwebview":{"id":"1","kernel":"WKWebview"},"usingComponents":true,"nvueStyleCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"xxhdpi":"icon-android-xxhdpi.png"}},"google":{"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\"/>"],"packagename":"uni.UNIA58238D","aliasname":"","password":"","keystore":"html5plus://test","custompermissions":true},"apple":{"dSYMs":false,"devices":"universal"},"plugins":{"ad":{},"audio":{"mp3":{"description":"Android平台录音支持MP3格式文件"}}},"orientation":"portrait-primary"},"statusbar":{"immersed":"supportedDevice","style":"dark","background":"#f8f8f8"},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"safearea":{"background":"#FFFFFF","bottom":{"offset":"auto"}},"uni-app":{"control":"uni-v3","vueVersion":"3","compilerVersion":"4.24","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal","webView":{"minUserAgentVersion":"49.0"}},"tabBar":{"position":"bottom","color":"#999","selectedColor":"#007aff","borderStyle":"rgba(0,0,0,0.4)","blurEffect":"none","fontSize":"10px","iconWidth":"24px","spacing":"3px","height":"50px","list":[{"pagePath":"pages/index/index","text":"首页","iconPath":"/static/home2.png","selectedIconPath":"/static/home1.png"},{"pagePath":"pages/shop/shop","text":"商城","iconPath":"/static/shop2.png","selectedIconPath":"/static/shop1.png"},{"pagePath":"pages/rank/rank","text":"排行榜","iconPath":"/static/rank2.png","selectedIconPath":"/static/rank1.png"},{"pagePath":"pages/information/information","text":"我的","iconPath":"/static/my2.png","selectedIconPath":"/static/my1.png"}],"selectedIndex":0,"shown":true,"child":["lauchwebview"],"selected":0},"adid":"127352090210"},"launch_path":"__uniappview.html"}

@ -0,0 +1 @@
.button[data-v-6aae2cc9]{display:block;width:80%;height:60px;margin:10px auto;padding:10px;background-color:#1e90ff;color:#fff;text-align:center;border-radius:5px}.list[data-v-6aae2cc9]{margin:20px;background-color:#f9f9f9;border-bottom:1px solid #ccc;padding:10px}.list-header[data-v-6aae2cc9]{display:flex;justify-content:space-between}.list-left[data-v-6aae2cc9]{flex-grow:2}.list-mid[data-v-6aae2cc9]{text-align:center;flex-grow:1}.list-right[data-v-6aae2cc9]{padding-left:15px;padding-right:8px}.list-item[data-v-6aae2cc9]{display:flex;justify-content:space-between;padding:5px 0}.item-left[data-v-6aae2cc9]{font-size:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;flex:6}.item-mid[data-v-6aae2cc9]{text-align:center;padding-left:60px;padding-right:45px;flex:1}.item-right[data-v-6aae2cc9]{text-align:center;padding-right:10px;flex:1}.button-container[data-v-6aae2cc9]{display:flex;justify-content:center}

@ -0,0 +1 @@
.begin{font-size:1.1875rem;font-weight:700;margin-top:10px;margin-bottom:10px;margin-left:8px}.page-body{display:flex;justify-content:center}.btn-area{width:90%;height:10rem}.btn-with-icon{height:95px;padding-left:.3125rem;border-radius:5px;display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}.btn-content{display:flex;flex-direction:column;align-items:flex-start}.btn-icon{width:1.5625rem;height:1.5625rem;margin-top:.625rem;margin-bottom:.15625rem}.shangke{font-size:12px;margin-top:auto}.btn-text{text-align:left;font-size:1.25rem;margin-left:1.875rem;margin-top:0}.forward-icon{width:1rem;height:1rem;margin-left:auto}

@ -0,0 +1 @@
.button[data-v-445667fd]{display:block;width:320px;height:60px;margin:25px auto 10px;padding:10px;background-color:#1e90ff;color:#fff;text-align:center;border-radius:5px}.answer-input[data-v-445667fd]{width:90%;padding:10px;margin:10px auto;border:1px solid #ccc;border-radius:5px}.question-container[data-v-445667fd]{display:flex;flex-direction:column;align-items:center;margin:20px;padding:10px}.txzz[data-v-445667fd]{display:flex;flex-direction:column;align-items:center}.atten[data-v-445667fd]{display:flex;align-content:center;bottom:40px}

@ -0,0 +1 @@
.header[data-v-d68e552e]{display:flex;justify-content:right;margin:10px}.exit[data-v-d68e552e]{font-weight:700;cursor:pointer}.profile-container[data-v-d68e552e]{padding:20px}.avatar-display[data-v-d68e552e]{margin-top:20px;display:flex;justify-content:center;margin-bottom:20px}.avatar-image[data-v-d68e552e]{width:100px;height:100px;border-radius:50%}.form[data-v-d68e552e]{margin-top:40px;display:flex;flex-direction:column;justify-content:center;align-items:center}.input-group[data-v-d68e552e]{margin-bottom:15px;width:90%}.label[data-v-d68e552e]{font-weight:700}.info-input[data-v-d68e552e]{margin:5px auto;border:1px solid #ccc;padding:5px;border-radius:4px}.info[data-v-d68e552e]{margin-left:5px}.save-button[data-v-d68e552e]{margin-top:30px;background-color:#1e90ff;width:320px;height:60px;color:#fff;padding:10px;border:none;border-radius:5px;text-align:center}

@ -0,0 +1 @@
.login-container[data-v-4958dc7a]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;height:760px}.title[data-v-4958dc7a]{font-size:30px;font-weight:700}.subtitle[data-v-4958dc7a]{font-size:16px;margin-top:10px}.form[data-v-4958dc7a]{width:100%;max-width:300px;margin-bottom:20px;margin-top:140px}.input-group[data-v-4958dc7a]{border:1px solid #ccc;display:flex;align-items:center;height:36px;margin-bottom:15px;background-color:#fff;border-radius:25px;padding:10px}.icon[data-v-4958dc7a]{margin-right:10px;font-size:18px}.input[data-v-4958dc7a]{flex:1;border:none;outline:none}.login-button[data-v-4958dc7a]{display:flex;align-items:center;justify-content:center;width:100%;max-width:300px;padding:10px;height:48px;background-color:#4caf50;color:#fff;border:none;border-radius:25px;text-align:center;margin-bottom:10px}.register-button[data-v-4958dc7a]{display:flex;align-items:center;justify-content:center;height:48px;width:100%;max-width:300px;padding:10px;background-color:transparent;color:#4caf50;border:1px solid #4CAF50;border-radius:25px;text-align:center}.error-message[data-v-4958dc7a]{color:red;margin-top:20px}

@ -0,0 +1 @@
.login-container[data-v-2cad1412]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;height:760px}.title[data-v-2cad1412]{font-size:30px;font-weight:700}.subtitle[data-v-2cad1412]{font-size:16px;margin-top:10px}.form[data-v-2cad1412]{width:100%;max-width:300px;margin-bottom:20px;margin-top:140px}.input-group[data-v-2cad1412]{border:1px solid #ccc;display:flex;align-items:center;height:36px;margin-bottom:15px;background-color:#fff;border-radius:25px;padding:10px}.icon[data-v-2cad1412]{margin-right:10px;font-size:18px}.input[data-v-2cad1412]{flex:1;border:none;outline:none}.login-button[data-v-2cad1412]{display:flex;align-items:center;justify-content:center;width:100%;max-width:300px;padding:10px;height:48px;background-color:#4caf50;color:#fff;border:none;border-radius:25px;text-align:center;margin-bottom:10px}.register-button[data-v-2cad1412]{display:flex;align-items:center;justify-content:center;height:48px;width:100%;max-width:300px;padding:10px;background-color:transparent;color:#4caf50;border:1px solid #4CAF50;border-radius:25px;text-align:center}.error-message[data-v-2cad1412]{color:red;margin-top:20px}

@ -0,0 +1 @@
.login-container[data-v-ad0bcc4e]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;height:760px}.title[data-v-ad0bcc4e]{font-size:30px;font-weight:700}.subtitle[data-v-ad0bcc4e]{font-size:16px;margin-top:10px}.form[data-v-ad0bcc4e]{width:100%;max-width:300px;margin-bottom:20px;margin-top:140px}.input-group[data-v-ad0bcc4e]{border:1px solid #ccc;display:flex;align-items:center;height:36px;margin-bottom:15px;background-color:#fff;border-radius:25px;padding:10px}.icon[data-v-ad0bcc4e]{margin-right:10px;font-size:18px}.input[data-v-ad0bcc4e]{flex:1;border:none;outline:none}.login-button[data-v-ad0bcc4e]{display:flex;align-items:center;justify-content:center;width:100%;max-width:300px;padding:10px;height:48px;background-color:#4caf50;color:#fff;border:none;border-radius:25px;text-align:center;margin-bottom:10px}.register-button[data-v-ad0bcc4e]{display:flex;align-items:center;justify-content:center;height:48px;width:100%;max-width:300px;padding:10px;background-color:transparent;color:#4caf50;border:1px solid #4CAF50;border-radius:25px;text-align:center}.error-message[data-v-ad0bcc4e]{color:red;margin-top:20px}

@ -0,0 +1 @@
.login-container[data-v-76bca410]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;height:760px}.title[data-v-76bca410]{font-size:30px;font-weight:700}.subtitle[data-v-76bca410]{font-size:16px;margin-top:10px}.form[data-v-76bca410]{width:100%;max-width:300px;margin-bottom:20px;margin-top:140px}.input-group[data-v-76bca410]{border:1px solid #ccc;display:flex;align-items:center;height:36px;margin-bottom:15px;background-color:#fff;border-radius:25px;padding:10px}.icon[data-v-76bca410]{margin-right:10px;font-size:18px}.input[data-v-76bca410]{flex:1;border:none;outline:none}.login-button[data-v-76bca410]{display:flex;align-items:center;justify-content:center;width:100%;max-width:300px;padding:10px;height:48px;background-color:#4caf50;color:#fff;border:none;border-radius:25px;text-align:center;margin-bottom:10px}.register-button[data-v-76bca410]{display:flex;align-items:center;justify-content:center;height:48px;width:100%;max-width:300px;padding:10px;background-color:transparent;color:#4caf50;border:1px solid #4CAF50;border-radius:25px;text-align:center}.error-message[data-v-76bca410]{color:red;margin-top:20px}

@ -0,0 +1 @@
.container{display:flex;flex-direction:column;align-items:center;height:100%;justify-content:flex-start;padding-top:100px}.section{display:flex;flex-direction:column;align-items:center;margin:20px 0}.identity-image{width:120px;height:120px;margin-bottom:20px}.identity-button{width:150px;padding:5px;background-color:#4caf50;color:#fff;border:none;border-radius:25px;text-align:center}.divider{width:80%;height:1px;background-color:#ccc;margin:20px 0}

@ -0,0 +1 @@
.container{display:flex;flex-direction:column;align-items:center;padding:20px}.circle{width:160px;height:160px;border-radius:50%;background-color:#1e90ff;display:flex;flex-direction:column;justify-content:center;align-items:center;margin-bottom:1.25rem}.total-points{display:flex;justify-content:center;align-items:center;font-size:38px;font-style:italic;font-weight:700;padding-right:12px}.points-label{font-size:18px;padding-top:.25rem}.stats{margin-top:20px;display:flex;flex-direction:column;width:100%}.stat-item{display:flex;justify-content:space-between;align-items:center;font-size:18px;margin-bottom:20px;padding:0 16px;border-bottom:1px solid #eee}.count{font-style:italic;font-weight:550;margin-left:auto}

@ -0,0 +1 @@
.rrpage[data-v-49fd074f]{display:flex;flex-direction:column}.rtop-nav[data-v-49fd074f]{display:flex;flex-direction:row;position:fixed;top:0;width:100%;height:2.5rem;background-color:#f9f9f9;border-bottom:1px solid #ccc;font-size:1.125rem;font-weight:700;justify-content:space-between}.rtop-left[data-v-49fd074f]{padding-left:1.40625rem;flex-grow:1}.rtop-scole[data-v-49fd074f]{text-align:center;padding-right:40px;flex-grow:1}.rtop-rank[data-v-49fd074f]{padding-right:20px}.rtop-left[data-v-49fd074f]{text-align:left}.rtop-scole[data-v-49fd074f],.rtop-rank[data-v-49fd074f]{text-align:right}.rrpage-body[data-v-49fd074f]{width:100%;margin-top:2.1875rem;margin-bottom:.9375rem;flex-direction:column}.rank-list[data-v-49fd074f]{display:flex;flex-direction:column;overflow-y:auto;border:1px solid #ccc;border-radius:5px;padding:10px;background-color:#fff}.rank-item[data-v-49fd074f]{display:flex;flex-direction:row;padding:10px;border-bottom:1px solid #eee;justify-content:space-between}.rank-item[data-v-49fd074f]:last-child{border-bottom:none}.rank-info[data-v-49fd074f]{display:flex;align-items:center}.rank-name[data-v-49fd074f]{font-size:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;flex:6}.rank-score[data-v-49fd074f]{text-align:center;padding-left:110px;flex:1}.rank-position[data-v-49fd074f]{text-align:center;padding-left:55px;flex:1}.rank-score[data-v-49fd074f],.rank-position[data-v-49fd074f]{font-size:1.125rem}.rbtn-area[data-v-49fd074f]{position:fixed;bottom:0;left:0;width:100%;height:36px;background-color:#1e90ff;text-align:center;border-top:1px solid #ccc;padding:10px 0;font-size:1.1875rem}.navigator[data-v-49fd074f]{display:inline-block}

@ -0,0 +1 @@
.product-list[data-v-60c61bc9]{max-width:600px;margin:auto;padding:20px;background:#fff;border-radius:5px}.product-item[data-v-60c61bc9]{margin-bottom:15px;padding:10px;border:1px solid #ddd;border-radius:5px}.shop-pri[data-v-60c61bc9]{display:flex;flex-direction:row;justify-content:center;align-items:center;margin-top:5px}.message[data-v-60c61bc9]{margin-top:10px;color:green;font-weight:700}.shop-btn[data-v-60c61bc9]{margin-top:.625rem}

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 914 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

File diff suppressed because one or more lines are too long

@ -0,0 +1,11 @@
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var require_app_css = __commonJS({
"app.css.js"(exports) {
const _style_0 = {};
exports.styles = [_style_0];
}
});
export default require_app_css();

@ -0,0 +1,2 @@
Promise.resolve("./app.css.js").then(() => {
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

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

Loading…
Cancel
Save