From 63eca9a2ddc94284665b4da0423cf6a502b34307 Mon Sep 17 00:00:00 2001 From: parameterman <2421405177@qq.com> Date: Fri, 24 Jun 2022 17:59:23 +0800 Subject: [PATCH] COURCE DEMO --- COURCE/.gitignore | 15 + COURCE/.idea/.gitignore | 3 + COURCE/.idea/compiler.xml | 6 + COURCE/.idea/gradle.xml | 20 + COURCE/.idea/misc.xml | 34 ++ COURCE/app/.gitignore | 1 + COURCE/app/build.gradle | 41 ++ COURCE/app/proguard-rules.pro | 21 + .../cource/ExampleInstrumentedTest.java | 26 ++ COURCE/app/src/main/AndroidManifest.xml | 53 +++ .../java/com/example/cource/BaseRespone.java | 37 ++ .../java/com/example/cource/Constans.java | 44 +++ .../com/example/cource/CourseActivity.java | 284 ++++++++++++++ .../java/com/example/cource/CourseInfo.java | 94 +++++ .../com/example/cource/CourseResponse.java | 68 ++++ .../cource/Course_create_Activity.java | 136 +++++++ .../java/com/example/cource/ErrorInfo.java | 49 +++ .../java/com/example/cource/ErrorRespone.java | 8 + .../com/example/cource/LoginActivity.java | 197 ++++++++++ .../java/com/example/cource/MainActivity.java | 367 ++++++++++++++++++ .../com/example/cource/Modifyactivity.java | 164 ++++++++ .../cource/Participate_in_Activity.java | 107 +++++ .../example/cource/PersonalInfomation.java | 64 +++ .../example/cource/QuitCourse_Activity.java | 105 +++++ .../com/example/cource/RecordAdapter.java | 58 +++ .../com/example/cource/RegisterActivity.java | 138 +++++++ .../java/com/example/cource/ResponseData.java | 40 ++ .../java/com/example/cource/SignAdapter.java | 57 +++ .../example/cource/SignAdapterStudent.java | 57 +++ .../com/example/cource/SignInfo_student.java | 41 ++ .../example/cource/Sign_CreateActivity.java | 137 +++++++ .../com/example/cource/Sign_inActivity.java | 126 ++++++ .../java/com/example/cource/UserRequest.java | 43 ++ .../java/com/example/cource/Userinfo.java | 133 +++++++ .../main/java/com/example/cource/record.java | 40 ++ .../java/com/example/cource/signInfo.java | 33 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ COURCE/app/src/main/res/drawable/add.png | Bin 0 -> 7591 bytes COURCE/app/src/main/res/drawable/group.png | Bin 0 -> 3397 bytes COURCE/app/src/main/res/drawable/group1.png | Bin 0 -> 3391 bytes .../ic_baseline_add_circle_outline_24.xml | 5 + .../main/res/drawable/ic_baseline_lock_24.xml | 5 + .../res/drawable/ic_baseline_lock_open_24.xml | 5 + .../res/drawable/ic_baseline_person_24.xml | 5 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++ .../src/main/res/drawable/introduction.png | Bin 0 -> 5249 bytes COURCE/app/src/main/res/drawable/member.png | Bin 0 -> 7456 bytes COURCE/app/src/main/res/drawable/member2.png | Bin 0 -> 7594 bytes COURCE/app/src/main/res/drawable/personal.png | Bin 0 -> 8486 bytes COURCE/app/src/main/res/drawable/teacher.png | Bin 0 -> 3994 bytes .../src/main/res/layout/activity_course.xml | 189 +++++++++ .../res/layout/activity_course_create.xml | 97 +++++ .../src/main/res/layout/activity_login.xml | 116 ++++++ .../app/src/main/res/layout/activity_main.xml | 113 ++++++ .../res/layout/activity_modifyactivity.xml | 189 +++++++++ .../res/layout/activity_participate_in.xml | 37 ++ .../main/res/layout/activity_quit_course.xml | 36 ++ .../src/main/res/layout/activity_register.xml | 108 ++++++ .../main/res/layout/activity_sign_create.xml | 97 +++++ .../src/main/res/layout/activity_sign_in.xml | 52 +++ .../app/src/main/res/layout/course_info.xml | 18 + .../app/src/main/res/layout/course_item.xml | 52 +++ COURCE/app/src/main/res/layout/dialog.xml | 6 + .../layout/fragment_personal_infomation.xml | 14 + COURCE/app/src/main/res/layout/sign_item.xml | 46 +++ .../src/main/res/menu/pop_menus_action.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/values-night/themes.xml | 16 + COURCE/app/src/main/res/values/colors.xml | 12 + COURCE/app/src/main/res/values/strings.xml | 9 + COURCE/app/src/main/res/values/themes.xml | 16 + .../main/res/xml/network_security_config.xml | 4 + .../com/example/cource/ExampleUnitTest.java | 17 + COURCE/build.gradle | 9 + COURCE/gradle.properties | 21 + COURCE/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + COURCE/gradlew | 185 +++++++++ COURCE/gradlew.bat | 89 +++++ COURCE/settings.gradle | 16 + 91 files changed, 4659 insertions(+) create mode 100644 COURCE/.gitignore create mode 100644 COURCE/.idea/.gitignore create mode 100644 COURCE/.idea/compiler.xml create mode 100644 COURCE/.idea/gradle.xml create mode 100644 COURCE/.idea/misc.xml create mode 100644 COURCE/app/.gitignore create mode 100644 COURCE/app/build.gradle create mode 100644 COURCE/app/proguard-rules.pro create mode 100644 COURCE/app/src/androidTest/java/com/example/cource/ExampleInstrumentedTest.java create mode 100644 COURCE/app/src/main/AndroidManifest.xml create mode 100644 COURCE/app/src/main/java/com/example/cource/BaseRespone.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Constans.java create mode 100644 COURCE/app/src/main/java/com/example/cource/CourseActivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/CourseInfo.java create mode 100644 COURCE/app/src/main/java/com/example/cource/CourseResponse.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Course_create_Activity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/ErrorInfo.java create mode 100644 COURCE/app/src/main/java/com/example/cource/ErrorRespone.java create mode 100644 COURCE/app/src/main/java/com/example/cource/LoginActivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/MainActivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Modifyactivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Participate_in_Activity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/PersonalInfomation.java create mode 100644 COURCE/app/src/main/java/com/example/cource/QuitCourse_Activity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/RecordAdapter.java create mode 100644 COURCE/app/src/main/java/com/example/cource/RegisterActivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/ResponseData.java create mode 100644 COURCE/app/src/main/java/com/example/cource/SignAdapter.java create mode 100644 COURCE/app/src/main/java/com/example/cource/SignAdapterStudent.java create mode 100644 COURCE/app/src/main/java/com/example/cource/SignInfo_student.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Sign_CreateActivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Sign_inActivity.java create mode 100644 COURCE/app/src/main/java/com/example/cource/UserRequest.java create mode 100644 COURCE/app/src/main/java/com/example/cource/Userinfo.java create mode 100644 COURCE/app/src/main/java/com/example/cource/record.java create mode 100644 COURCE/app/src/main/java/com/example/cource/signInfo.java create mode 100644 COURCE/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 COURCE/app/src/main/res/drawable/add.png create mode 100644 COURCE/app/src/main/res/drawable/group.png create mode 100644 COURCE/app/src/main/res/drawable/group1.png create mode 100644 COURCE/app/src/main/res/drawable/ic_baseline_add_circle_outline_24.xml create mode 100644 COURCE/app/src/main/res/drawable/ic_baseline_lock_24.xml create mode 100644 COURCE/app/src/main/res/drawable/ic_baseline_lock_open_24.xml create mode 100644 COURCE/app/src/main/res/drawable/ic_baseline_person_24.xml create mode 100644 COURCE/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 COURCE/app/src/main/res/drawable/introduction.png create mode 100644 COURCE/app/src/main/res/drawable/member.png create mode 100644 COURCE/app/src/main/res/drawable/member2.png create mode 100644 COURCE/app/src/main/res/drawable/personal.png create mode 100644 COURCE/app/src/main/res/drawable/teacher.png create mode 100644 COURCE/app/src/main/res/layout/activity_course.xml create mode 100644 COURCE/app/src/main/res/layout/activity_course_create.xml create mode 100644 COURCE/app/src/main/res/layout/activity_login.xml create mode 100644 COURCE/app/src/main/res/layout/activity_main.xml create mode 100644 COURCE/app/src/main/res/layout/activity_modifyactivity.xml create mode 100644 COURCE/app/src/main/res/layout/activity_participate_in.xml create mode 100644 COURCE/app/src/main/res/layout/activity_quit_course.xml create mode 100644 COURCE/app/src/main/res/layout/activity_register.xml create mode 100644 COURCE/app/src/main/res/layout/activity_sign_create.xml create mode 100644 COURCE/app/src/main/res/layout/activity_sign_in.xml create mode 100644 COURCE/app/src/main/res/layout/course_info.xml create mode 100644 COURCE/app/src/main/res/layout/course_item.xml create mode 100644 COURCE/app/src/main/res/layout/dialog.xml create mode 100644 COURCE/app/src/main/res/layout/fragment_personal_infomation.xml create mode 100644 COURCE/app/src/main/res/layout/sign_item.xml create mode 100644 COURCE/app/src/main/res/menu/pop_menus_action.xml create mode 100644 COURCE/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 COURCE/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 COURCE/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 COURCE/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 COURCE/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 COURCE/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 COURCE/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 COURCE/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 COURCE/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 COURCE/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 COURCE/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 COURCE/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 COURCE/app/src/main/res/values-night/themes.xml create mode 100644 COURCE/app/src/main/res/values/colors.xml create mode 100644 COURCE/app/src/main/res/values/strings.xml create mode 100644 COURCE/app/src/main/res/values/themes.xml create mode 100644 COURCE/app/src/main/res/xml/network_security_config.xml create mode 100644 COURCE/app/src/test/java/com/example/cource/ExampleUnitTest.java create mode 100644 COURCE/build.gradle create mode 100644 COURCE/gradle.properties create mode 100644 COURCE/gradle/wrapper/gradle-wrapper.jar create mode 100644 COURCE/gradle/wrapper/gradle-wrapper.properties create mode 100644 COURCE/gradlew create mode 100644 COURCE/gradlew.bat create mode 100644 COURCE/settings.gradle diff --git a/COURCE/.gitignore b/COURCE/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/COURCE/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/COURCE/.idea/.gitignore b/COURCE/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/COURCE/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/COURCE/.idea/compiler.xml b/COURCE/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/COURCE/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/COURCE/.idea/gradle.xml b/COURCE/.idea/gradle.xml new file mode 100644 index 0000000..526b4c2 --- /dev/null +++ b/COURCE/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/COURCE/.idea/misc.xml b/COURCE/.idea/misc.xml new file mode 100644 index 0000000..5ea60e3 --- /dev/null +++ b/COURCE/.idea/misc.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/COURCE/app/.gitignore b/COURCE/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/COURCE/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/COURCE/app/build.gradle b/COURCE/app/build.gradle new file mode 100644 index 0000000..f4b18da --- /dev/null +++ b/COURCE/app/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 32 + + defaultConfig { + applicationId "com.example.cource" + minSdk 27 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.growingio.android:okhttp3:3.3.6' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/COURCE/app/proguard-rules.pro b/COURCE/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/COURCE/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/COURCE/app/src/androidTest/java/com/example/cource/ExampleInstrumentedTest.java b/COURCE/app/src/androidTest/java/com/example/cource/ExampleInstrumentedTest.java new file mode 100644 index 0000000..6cd9db0 --- /dev/null +++ b/COURCE/app/src/androidTest/java/com/example/cource/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.cource; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.cource", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/AndroidManifest.xml b/COURCE/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..16894c1 --- /dev/null +++ b/COURCE/app/src/main/AndroidManifest.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/BaseRespone.java b/COURCE/app/src/main/java/com/example/cource/BaseRespone.java new file mode 100644 index 0000000..53a2738 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/BaseRespone.java @@ -0,0 +1,37 @@ +package com.example.cource; + +public class BaseRespone { + private int code; + private String msg; + + + public final static int RESPONE_SUCCESS = 0; + private T data; + public BaseRespone() { + + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/Constans.java b/COURCE/app/src/main/java/com/example/cource/Constans.java new file mode 100644 index 0000000..a5e6de1 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Constans.java @@ -0,0 +1,44 @@ +package com.example.cource; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public final class Constans { + private Constans(){ + + } + + + public static String Accept="application/json, text/plain, */*"; + public static String Content_Type="application/json"; + public static String ReqUrl ="http://47.107.52.7:88/member/sign/"; + public static String appId = "7a313d4c78764cb89dde6c031efdc480"; + public static String appSecret="32939480977be35ff4daf88e1b8c209ce0c12"; + public static String all_course = "course/all"; + public static String detail = "course/detail"; + public static String student= "course/student"; + public static String imagePath = "https://guet-lab.oss-cn-guangzhou.aliyuncs.com/api/2022/06/14/Screenshot_2021-10-16_21_47_43.png"; + public static String studentdrop= "course/student/drop"; + + public static String studentselect= "course/student/select"; + + public static String studentsign = "course/student/sign"; + + + public static String studentsignList = "course/student/signList"; + public static String teacher = "course/teacher"; + public static String teacherfinished = "course/teacher/finished"; + public static String teacherinitiate = "course/teacher/initiate"; + public static String teacherpage = "course/teacher/page"; + public static String teacherunfinish = "course/teacher/finished"; + public static String imageload= "image/load"; + public static String userlogin= "user/login"; + public static String userrigister= "user/register"; + public static String userupdate= "user/update"; + +} diff --git a/COURCE/app/src/main/java/com/example/cource/CourseActivity.java b/COURCE/app/src/main/java/com/example/cource/CourseActivity.java new file mode 100644 index 0000000..1a3bd87 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/CourseActivity.java @@ -0,0 +1,284 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class CourseActivity extends AppCompatActivity { + + private List signRecords; + private List signRecords1; + private TextView sign,action,head; + private ImageView signment; + private SwipeRefreshLayout swipe_course; + + private int status=0; + private String signId="0"; + private SignAdapterStudent adapter1; + private SignAdapter adapter; + private ListView lv_sign; + private String courseName; + private int courseId,roleId; + private long userId; + private final Callback callback=new okhttp3.Callback(){ + + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response.isSuccessful()){ + final String body1 = response.body().string(); + Log.println(Log.INFO,"OK",body1); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>>>(){}.getType(); + BaseRespone>> newUserResponse = gson.fromJson(body1,jsonType); + Log.println(Log.INFO,"records","what3?"); + if (newUserResponse.getData()!=null) + { + if (!adapter1.isEmpty()) { + adapter1.clear(); + }Log.println(Log.INFO,"records","what2?"); + ResponseData> u = newUserResponse.getData(); + if (!u.getRecords().isEmpty()) { + List s = u.getRecords(); + for (SignInfo_student s1:s){ + adapter1.add(s1); + } + adapter1.notifyDataSetChanged(); + Log.println(Log.INFO,"records","what1?"); + } + }Log.println(Log.INFO,"records","what?"); + + } + }); + }else { + String msg = response.message(); + int code = response.code(); + Log.println(Log.ERROR,"error",String.valueOf(code)+" "+msg); + } + } + + }; + private final Callback callback1 = new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response.isSuccessful()){ + String body2 = response.body().string(); + Log.println(Log.INFO,"OK",body2); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone newUserResponse = gson.fromJson(body2,jsonType); + signInfo u= newUserResponse.getData(); + //Log.println(Log.INFO,"OK",Long.toString(u.getCourseId())); + if (!adapter.isEmpty()) + { + adapter.clear(); + + }else { + adapter.add(u); + adapter.notifyDataSetChanged(); + Log.println(Log.INFO,"test","nosign"); + } + } + }); + } + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_course); + Intent intent = getIntent(); + + lv_sign =findViewById(R.id.sign_lv); + signment =findViewById(R.id.introduction); + + swipe_course = findViewById(R.id.swipe_course); + courseId = intent.getIntExtra("courseId",0); + userId = intent.getLongExtra("UserId",0); + + roleId = intent.getIntExtra("roleId",0); + courseName=intent.getStringExtra("courseName"); + + head =findViewById(R.id.TvCalendar); + head.setText(courseName); + sign = findViewById(R.id.sign); + action = findViewById(R.id.action); + sign.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + action.setTextColor(0xFFE0DBDB); + sign.setTextColor(0xFF000000); + + status=0; + if (roleId==1){ + getSign(); + }else { + getSignStudent(status); + } + } + }); + action.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + status=1; + sign.setTextColor(0xFFE0DBDB); + action.setTextColor(0xFF000000); + if (roleId==0){ + getSignStudent(status); + } + } + }); + + signment.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (roleId==1){ + Intent intent1 = new Intent(CourseActivity.this, Sign_CreateActivity.class); + intent1.putExtra("courseName", courseName); + intent1.putExtra("courseId", courseId); + intent1.putExtra("userId", userId); + startActivity(intent1); + }else if (roleId ==0){ + Intent intent1 = new Intent(CourseActivity.this, Sign_inActivity.class); + intent1.putExtra("userId", userId); + intent1.putExtra("userSignId", signId); + startActivity(intent1); + } + } + }); + Log.println(Log.INFO," Course id:",Integer.toString(courseId)); + Log.println(Log.INFO,"user id:",Long.toString(userId)); + + if (roleId==0){ + initData(); + }else { + initSign(); + } + + swipe_course.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + if (roleId==0){ + getSignStudent(status); + }else { + getSign(); + } + swipe_course.setRefreshing(false); + } + }); + } + + void getSignStudent(int i){ + new Thread(new Runnable() { + @Override + public void run() { + + String urlparam; + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + if (i==0){ + urlparam = "?courseId="+courseId+"&status=0"+"&userId="+userId; + }else { + urlparam = "?courseId=" + courseId + "&status=1" + "&userId=" + userId; + } + Request request1 = new Request.Builder().url(Constans.ReqUrl+Constans.studentsignList+urlparam) + .headers(Headers.of(map1)) + .get() + .build(); + + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request1).enqueue(callback); + }catch (NetworkOnMainThreadException e){ + e.printStackTrace(); + Log.println(Log.ERROR,"error","error"); + } + } + }).start(); + } + void initData(){ + signRecords1 = new ArrayList<>(); + adapter1 = new SignAdapterStudent(CourseActivity.this,R.layout.course_item,signRecords1); + lv_sign.setAdapter(adapter1); + getSignStudent(0); + } + void initSign(){ + signRecords = new ArrayList<>(); + adapter = new SignAdapter(CourseActivity.this,R.layout.course_item,signRecords); + lv_sign.setAdapter(adapter); + getSign(); + } + void getSign(){ + //获取签到列表 + new Thread(new Runnable() { + @Override + public void run() { + + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + String urlparam = "?courseId="+courseId+"&userId="+userId; + + Request request1 = new Request.Builder().url(Constans.ReqUrl+Constans.teacherpage+urlparam) + .headers(Headers.of(map1)) + .get() + .build(); + + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request1).enqueue(callback1); + }catch (NetworkOnMainThreadException e){ + e.printStackTrace(); + Log.println(Log.ERROR,"error","error"); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/CourseInfo.java b/COURCE/app/src/main/java/com/example/cource/CourseInfo.java new file mode 100644 index 0000000..cd4056d --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/CourseInfo.java @@ -0,0 +1,94 @@ +package com.example.cource; + +public class CourseInfo { + private int courseId; + private String coursePhoto; + private String collegeName; + private String courseName; + private long endTime; + private String introduce; + private String realName; + private long startTime; + private long userID; + private String userName; + + public String getCollegeName() { + return collegeName; + } + + public void setCollegeName(String collegeName) { + this.collegeName = collegeName; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public String getCoursePhoto() { + return coursePhoto; + } + + public void setCoursePhoto(String coursePhoto) { + this.coursePhoto = coursePhoto; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getIntroduce() { + return introduce; + } + + public void setIntroduce(String intrudoce) { + this.introduce = intrudoce; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getUserID() { + return userID; + } + + public void setUserID(long userID) { + this.userID = userID; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public int getCourseId() { + return courseId; + } + + public void setCourseId(int courseId) { + this.courseId = courseId; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/CourseResponse.java b/COURCE/app/src/main/java/com/example/cource/CourseResponse.java new file mode 100644 index 0000000..92d4e21 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/CourseResponse.java @@ -0,0 +1,68 @@ +package com.example.cource; + +public class CourseResponse { + private int code; + private String msg; + + + private final static int RESPONE_SUCCESS = 0; + private T data; + private int total; + private int current; + private int size; + + public CourseResponse() { + + } + public static int getResponeSuccess() { + return RESPONE_SUCCESS; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getCurrent() { + return current; + } + + public void setCurrent(int current) { + this.current = current; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/Course_create_Activity.java b/COURCE/app/src/main/java/com/example/cource/Course_create_Activity.java new file mode 100644 index 0000000..17224f8 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Course_create_Activity.java @@ -0,0 +1,136 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class Course_create_Activity extends AppCompatActivity { + + private Long userid; + private String userName,realName,collegeName; + private EditText StartTime,EndTime,CourseName,Introduction; + private Button create_course; + private Callback callback = new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()){ + final String body = response.body().string(); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone stringBaseRespone =gson.fromJson(body,jsonType); + int code = stringBaseRespone.getCode(); + String msg = stringBaseRespone.getMsg(); + Log.println(Log.INFO,"code",Integer.toString(code)+msg); + if (code ==200){ + Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_SHORT).show(); + }else Toast.makeText(getApplicationContext(),stringBaseRespone.getMsg(),Toast.LENGTH_SHORT).show(); + } + }); + + } + + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_course_create); + Intent intent = getIntent(); + userid=intent.getLongExtra("userId",0); + collegeName = intent.getStringExtra("collegeName"); + userName = intent.getStringExtra("userName"); + realName = intent.getStringExtra("realName"); + Log.println(Log.INFO,"id_course_create_activity",Long.toString(userid)); + + StartTime = findViewById(R.id.courseStartTime_create); + EndTime = findViewById(R.id.courseEnd_create); + CourseName = findViewById(R.id.courseName_create); + Introduction = findViewById(R.id.courseIntroduction_create); + create_course = findViewById(R.id.Bt_course_create); + + create_course.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(realName ==null||collegeName==null){ + Toast.makeText(getApplicationContext(),"请完善个人信息",Toast.LENGTH_SHORT).show(); + }else { + courseCreate(); + } + } + }); + } + void courseCreate(){ + + new Thread(new Runnable() { + @Override + public void run() { + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + JSONObject jsonObject = new JSONObject(); + Log.println(Log.ERROR,"jsontest","this is"); + try { + jsonObject.put("collegeName",collegeName); + jsonObject.put("courseName",CourseName.getText().toString()); + jsonObject.put("coursePhoto",Constans.imagePath); + jsonObject.put("realName",realName); + jsonObject.put("endTime",EndTime.getText().toString()); + jsonObject.put("introduce",Introduction.getText().toString()); + jsonObject.put("startTime",StartTime.getText().toString()); + jsonObject.put("userId",userid); + jsonObject.put("userName",userName); + } catch (JSONException e) { + e.printStackTrace(); + } + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),String.valueOf(jsonObject)); + Request request = new Request.Builder().url(Constans.ReqUrl+Constans.teacher) + .headers(Headers.of(map1)) + .post(requestBody) + .build(); + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/ErrorInfo.java b/COURCE/app/src/main/java/com/example/cource/ErrorInfo.java new file mode 100644 index 0000000..a8dee01 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/ErrorInfo.java @@ -0,0 +1,49 @@ +package com.example.cource; + +public class ErrorInfo { + private String timestamp; + private String error; + private String message; + private String path; + private int status; + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/ErrorRespone.java b/COURCE/app/src/main/java/com/example/cource/ErrorRespone.java new file mode 100644 index 0000000..667af91 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/ErrorRespone.java @@ -0,0 +1,8 @@ +package com.example.cource; + +public class ErrorRespone { + private T data; + public ErrorRespone() { + + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/LoginActivity.java b/COURCE/app/src/main/java/com/example/cource/LoginActivity.java new file mode 100644 index 0000000..c1b0979 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/LoginActivity.java @@ -0,0 +1,197 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +import okhttp3.Call; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class LoginActivity extends AppCompatActivity{ + + private Button login; + private EditText user,passwd; + private String username,password; + private TextView register; + private CheckBox PwdRem; + + private okhttp3.Callback callback =new okhttp3.Callback(){ + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response.isSuccessful()){ + final String body = response.body().string(); + int code = response.code(); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone newUserResponse = gson.fromJson(body,jsonType); + Userinfo u =(Userinfo) newUserResponse.getData(); + long code1 = u.getId(); + String userName = u.getUserName(); + String realName = u.getRealName(); + String collegeName = u.getCollegeName(); + String roleId = u.getRoleId(); + Log.println(Log.INFO,"OK",body); + Log.println(Log.INFO,"cide",Long.toString(code1)); + switch (code){ + case 500: + Toast.makeText(getApplicationContext(),"未找到该用户",Toast.LENGTH_SHORT).show(); + break; + case 200:Intent intent =new Intent(LoginActivity.this,MainActivity.class); + intent.putExtra("id",code1); + intent.putExtra("role",Integer.valueOf(roleId)); + intent.putExtra("collegeName",collegeName); + intent.putExtra("userName",userName); + intent.putExtra("realName",realName); + intent.putExtra("email",u.getEmail()); + intent.putExtra("idNumber",u.getIdNumber()); + intent.putExtra("inTime",u.getInSchoolTime()); + intent.putExtra("phone",u.getPhone()); + intent.putExtra("gender",u.isGender()); + startActivity(intent); + break; + default: Toast.makeText(getApplicationContext(),newUserResponse.getMsg(),Toast.LENGTH_SHORT).show(); + break; + } + } + }); + }else { + int code = response.code(); + Log.println(Log.ERROR,"error",String.valueOf(code)); + } + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + login = findViewById(R.id.login_button); + user = findViewById(R.id.username); + passwd = findViewById(R.id.passwd); + register = findViewById(R.id.register); + PwdRem = findViewById(R.id.RememberPwd); + login.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Rember(); + Login(); + } + }); + register.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + register(); + } + }); + String spFileName = getResources().getString(R.string.shared_preferences_file_name); + String accountKey = getResources().getString(R.string.login_account_name); + String passwordKey = getResources().getString(R.string.login_password); + String rememberPasswordKey = getResources().getString(R.string.login_remember_password); + + SharedPreferences spFile = getSharedPreferences(spFileName, Context.MODE_PRIVATE); + String password = spFile.getString(passwordKey,null); + String account = spFile.getString(accountKey,null); + Boolean rememberPassword = spFile.getBoolean(rememberPasswordKey,false); + + if (account!=null&&!TextUtils.isEmpty(account)){ + user.setText(account); + } + + if (password!=null&&!TextUtils.isEmpty(password)){ + passwd.setText(password); + } + PwdRem.setChecked(rememberPassword); + + } + + void Rember(){ + String spFileName = getResources().getString(R.string.shared_preferences_file_name); + String accountKey = getResources().getString(R.string.login_account_name); + String passwordKey = getResources().getString(R.string.login_password); + String rememberPasswordKey = getResources().getString(R.string.login_remember_password); + + SharedPreferences spFile = getSharedPreferences(spFileName, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = spFile.edit(); + + if (PwdRem.isChecked()){ + String password = passwd.getText().toString(); + String account = user.getText().toString(); + editor.putString(accountKey,account); + editor.putString(passwordKey,password); + editor.putBoolean(rememberPasswordKey,true); + editor.apply(); + }else{ + editor.remove(accountKey); + editor.remove(passwordKey); + editor.remove(rememberPasswordKey); + editor.apply(); + } + + } + void Login(){ + username = user.getText().toString(); + password = passwd.getText().toString(); + new Thread(new Runnable() { + @Override + public void run() { + UserRequest requestobj = new UserRequest(); + requestobj.setPassword(password); + requestobj.setUsername(username); + String urlParam = requestobj.toString(); + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + Log.println(Log.INFO,"param",urlParam); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), urlParam); + Request request = new Request.Builder().url(Constans.ReqUrl+Constans.userlogin+urlParam) + .addHeader("appId",Constans.appId) + .addHeader("appSecret",Constans.appSecret).post(requestBody).build(); + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request).enqueue(callback); + + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + }).start(); + } + void register(){ + Intent intent = new Intent(LoginActivity.this,RegisterActivity.class); + startActivity(intent); + } + +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/MainActivity.java b/COURCE/app/src/main/java/com/example/cource/MainActivity.java new file mode 100644 index 0000000..8a01aa2 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/MainActivity.java @@ -0,0 +1,367 @@ +package com.example.cource; + +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.PopupMenu; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class MainActivity extends AppCompatActivity { + + private String urlParam,collegeName,userName,realName,phone,email,inTime; + private boolean gender; + private long code,idNumber; + private int roleId; + private ListView recordList; + private List records; + private RecordAdapter adapter; + private TextView all,teaching,studying; + private SwipeRefreshLayout swipe; + + private int mode=0; + private ImageView head_image; + private Toolbar mytoolbar; + private Callback callback=new okhttp3.Callback(){ + + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response.isSuccessful()){ + final String body = response.body().string(); + Log.println(Log.INFO,"OK",body); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>>>(){}.getType(); + BaseRespone>> newUserResponse = gson.fromJson(body,jsonType); + ResponseData> u= newUserResponse.getData(); + if (!u.getRecords().isEmpty()) { + adapter.clear(); + for (record r : u.getRecords()) { + adapter.add(r); + } + + adapter.notifyDataSetChanged(); + } + else { + Toast.makeText(getApplicationContext(),"您还没用创建课程",Toast.LENGTH_SHORT).show(); + } + int c = newUserResponse.getCode(); + if (u!=null){ + Log.println(Log.INFO,"code",Integer.toString(c)); + int id = u.getCurrent(); + Log.println(Log.INFO,"current",Integer.toString(id)); + Log.println(Log.INFO,"records",records.get(0).getCoursePhoto()); + + } + } + }); + }else { + /*final String errorbody = response.body().string(); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken(){}.getType(); + ErrorInfo newUserResponse = gson.fromJson(errorbody,jsonType); + String message =newUserResponse.getMessage(); + Log.println(Log.ERROR,"error",message); + } + });*/ + String msg = response.message(); + int code = response.code(); + Log.println(Log.ERROR,"error",String.valueOf(code)+" "+msg); + } + } + + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + Intent intent = getIntent(); + collegeName = intent.getStringExtra("collegeName"); + realName = intent.getStringExtra("realName"); + userName = intent.getStringExtra("userName"); + roleId = intent.getIntExtra("role",2); + code = intent.getLongExtra("id",0); + phone = intent.getStringExtra("phone"); + email = intent.getStringExtra("email"); + inTime = intent.getStringExtra("inTime"); + gender = intent.getBooleanExtra("gender",true); + idNumber = intent.getLongExtra("idNumber",0); + Log.println(Log.INFO,"intent",Long.toString(code)+" "+Integer.toString(roleId)); + + all = findViewById(R.id.all); + teaching = findViewById(R.id.teaching); + studying = findViewById(R.id.study); + + head_image = findViewById(R.id.head_image); + mytoolbar = findViewById(R.id.myToolbar); + setSupportActionBar(mytoolbar); + + swipe = findViewById(R.id.swipe); + + initView(); + initCourse(); + + all.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mode=0; + all.setTextColor(0xFF000000); + teaching.setTextColor(0xFFBBBCBF); + studying.setTextColor(0xFFBBBCBF); + search(0); + } + }); + + teaching.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (roleId==1){ + mode=1; + teaching.setTextColor(0xFF000000); + all.setTextColor(0xFFBBBCBF); + studying.setTextColor(0xFFBBBCBF); + search(1); + } + } + }); + studying.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(roleId==0) { + mode=2; + all.setTextColor(0xFFBBBCBF); + teaching.setTextColor(0xFFBBBCBF); + studying.setTextColor(0xFF000000); + search(2); + } + } + }); + + head_image.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + achieve(3); + } + }); + + swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + + switch (mode){ + case 1:search(1); + break; + case 2:search(2); + break; + default:search(0); + break; + } + swipe.setRefreshing(false); + Toast.makeText(getApplicationContext(),"刷新完成",Toast.LENGTH_SHORT).show(); + } + }); + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.pop_menus_action,menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()){ + case R.id.participate: + if (roleId==0){ + achieve(1); + }else Toast.makeText(MainActivity.this,"您不是学生",Toast.LENGTH_SHORT).show(); + return true; + case R.id.create: + if (roleId==1) { + achieve(2); + }else Toast.makeText(MainActivity.this,"您不是教师",Toast.LENGTH_SHORT).show(); + return true; + case R.id.drop: + if (roleId==0){ + achieve(0); + }else Toast.makeText(MainActivity.this,"您不是学生",Toast.LENGTH_SHORT).show(); + default: + return super.onOptionsItemSelected(item); + + } + } + + void achieve(int id){ + Intent intent; + switch (id){ + case 0:intent = new Intent(MainActivity.this,QuitCourse_Activity.class); + intent.putExtra("userId",code); + startActivity(intent); + break; + case 1: + intent = new Intent(MainActivity.this,Participate_in_Activity.class); + intent.putExtra("userId",code); + startActivity(intent); + break; + case 2: + intent = new Intent(MainActivity.this,Course_create_Activity.class); + intent.putExtra("userId",code); + intent.putExtra("realName",realName); + intent.putExtra("collegeName",collegeName); + intent.putExtra("userName",userName); + startActivity(intent); + break; + case 3: + intent = new Intent(MainActivity.this,Modifyactivity.class); + intent.putExtra("userId",code); + intent.putExtra("realName",realName); + intent.putExtra("collegeName",collegeName); + intent.putExtra("userName",userName); + intent.putExtra("phone",phone); + intent.putExtra("email",email); + intent.putExtra("inTime",inTime); + intent.putExtra("idNumber",idNumber); + intent.putExtra("gender",gender); + startActivity(intent); + break; + default: break; + } + } + void initView(){ + recordList = findViewById(R.id.lv_course); + + recordList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Intent intent = new Intent(MainActivity.this,CourseActivity.class); + record r = adapter.getItem(position); + intent.putExtra("courseName",r.getCourseName()); + intent.putExtra("courseId",r.getCourseId()); + intent.putExtra("UserId",code); + intent.putExtra("roleId",roleId); + startActivity(intent); + } + }); + } + void initCourse(){ + records = new ArrayList<>(); + adapter = new RecordAdapter(MainActivity.this,R.layout.course_item,records); + recordList.setAdapter(adapter); + + refresh(); + //Log.println(Log.INFO,"records",records.get(0).toString()); + + + } + void refresh(){ + new Thread(new Runnable() { + @Override + public void run() { + + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + + + Request request1 = new Request.Builder().url(Constans.ReqUrl+Constans.all_course).headers(Headers.of(map1)) + .get() + .build(); + + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request1).enqueue(callback); + }catch (NetworkOnMainThreadException e){ + e.printStackTrace(); + Log.println(Log.ERROR,"error","error"); + } + } + }).start(); + } + void search(int c){ + switch (c){ + case 1:urlParam = Constans.teacherunfinish+"?userId="+Long.toString(code); + break; + + case 2:urlParam = Constans.student+"?userId="+Long.toString(code); + break; + default:urlParam=Constans.all_course; break; + } + new Thread(new Runnable() { + @Override + public void run() { + + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + + Request request1 = new Request.Builder().url(Constans.ReqUrl+urlParam).headers(Headers.of(map1)) + .get() + .build(); + + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request1).enqueue(callback); + }catch (NetworkOnMainThreadException e){ + e.printStackTrace(); + Log.println(Log.ERROR,"error","error"); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/Modifyactivity.java b/COURCE/app/src/main/java/com/example/cource/Modifyactivity.java new file mode 100644 index 0000000..743b490 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Modifyactivity.java @@ -0,0 +1,164 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class Modifyactivity extends AppCompatActivity { + + private TextView collegeName,email,gender,idNumber,inTime,phone,realName,userName; + + private Long userId; + private Button modify_button; + private Callback callback = new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()){ + final String body = response.body().string(); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone stringBaseRespone =gson.fromJson(body,jsonType); + int code = stringBaseRespone.getCode(); + String msg = stringBaseRespone.getMsg(); + Log.println(Log.INFO,"code",Integer.toString(code)+msg); + if (code ==200){ + Toast.makeText(getApplicationContext(),"修改成功",Toast.LENGTH_SHORT).show(); + }else Toast.makeText(getApplicationContext(),stringBaseRespone.getMsg(),Toast.LENGTH_SHORT).show(); + } + }); + + } + + } + + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_modifyactivity); + Intent intent = getIntent(); + userId=intent.getLongExtra("userId",0); + collegeName = findViewById(R.id.ed_college_Name_modify); + email = findViewById(R.id.ed_email_modify); + gender = findViewById(R.id.ed_gender_modify); + idNumber = findViewById(R.id.ed_idNumber_modify); + inTime = findViewById(R.id.ed_inSchoolTime_modify); + phone = findViewById(R.id.ed_phone_modify); + realName = findViewById(R.id.ed_realName_modify); + userName = findViewById(R.id.ed_userName_modify); + + collegeName.setText(intent.getStringExtra("collegeName")); + realName.setText(intent.getStringExtra("realName")); + userName.setText(intent.getStringExtra("userName")); + if (intent.getLongExtra("idNumber",0)!=0){ + String s = Long.toString(intent.getLongExtra("idNumber",0)); + idNumber.setText(s); + } + inTime.setText(intent.getStringExtra("inTime")); + phone.setText(intent.getStringExtra("phone")); + email.setText(intent.getStringExtra("email")); + if (intent.getBooleanExtra("gender",true)){ + gender.setText("男"); + }else gender.setText("女"); + modify_button =findViewById(R.id.button_modify); + modify_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + modify(); + } + }); + } + + void modify(){ + new Thread(new Runnable() { + @Override + public void run() { + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + JSONObject jsonObject = new JSONObject(); + Log.println(Log.ERROR,"jsontest","this is"); + try { + if (collegeName.getText()!=null) { + jsonObject.put("collegeName", collegeName.getText().toString()); + } + if (email.getText()!=null) { + jsonObject.put("email", email.getText().toString()); + } + if (gender.getText().toString().equals("男")){ + jsonObject.put("gender","true"); + }else { + jsonObject.put("gender","false"); + } + if (realName.getText().toString()!=null) { + jsonObject.put("realName", realName.getText().toString()); + } + if (inTime.getText().toString()!=null) { + jsonObject.put("inSchoolTime", inTime.getText().toString()); + } + if (phone.getText().toString()!=null){ + jsonObject.put("phone", phone.getText().toString()); + } + if (userName.getText().toString()!=null){ + jsonObject.put("userName", userName.getText().toString()); + } + jsonObject.put("id",userId); + if (idNumber.getText().toString()!=null) { + jsonObject.put("idNumber", idNumber.getText().toString()); + } + } catch (JSONException e) { + e.printStackTrace(); + } + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),String.valueOf(jsonObject)); + Request request = new Request.Builder().url(Constans.ReqUrl+Constans.userupdate) + .headers(Headers.of(map1)) + .post(requestBody) + .build(); + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/Participate_in_Activity.java b/COURCE/app/src/main/java/com/example/cource/Participate_in_Activity.java new file mode 100644 index 0000000..b34fc66 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Participate_in_Activity.java @@ -0,0 +1,107 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class Participate_in_Activity extends AppCompatActivity { + + private Long userId; + private EditText Edit; + private Button Bt_participate; + private Callback callback = new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()){ + final String body = response.body().string(); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone newUserResponse = gson.fromJson(body,jsonType); + int code = newUserResponse.getCode(); + Log.println(Log.INFO,"cide",Integer.toString(code)); + if (code ==200){ + + Toast.makeText(getApplicationContext(),"加入成功",Toast.LENGTH_SHORT).show(); + }else Toast.makeText(getApplicationContext(),newUserResponse.getMsg(),Toast.LENGTH_SHORT).show(); + } + }); + + }else Log.println(Log.INFO,"cide",Integer.toString(response.code())+response.message()); + + + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_participate_in); + Intent intent =getIntent(); + userId = intent.getLongExtra("userId",0); + + Edit =findViewById(R.id.Edit_courseid); + Bt_participate = findViewById(R.id.Bt_participate_in); + Bt_participate.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + participate_in(); + } + }); + } + void participate_in(){ + + new Thread(new Runnable() { + @Override + public void run() { + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + String urlParam ="?"+"courseId="+Edit.getText().toString()+"&userId="+userId; + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), urlParam); + Request request = new Request.Builder().url(Constans.ReqUrl+Constans.studentselect+urlParam) + .headers(Headers.of(map1)) + .post(requestBody).build(); + try { + OkHttpClient client = new OkHttpClient() ; + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + }).start(); + } + +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/PersonalInfomation.java b/COURCE/app/src/main/java/com/example/cource/PersonalInfomation.java new file mode 100644 index 0000000..5deeaed --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/PersonalInfomation.java @@ -0,0 +1,64 @@ +package com.example.cource; + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link PersonalInfomation#newInstance} factory method to + * create an instance of this fragment. + */ +public class PersonalInfomation extends Fragment { + + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + public PersonalInfomation() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment PersonalInfomation. + */ + // TODO: Rename and change types and number of parameters + public static PersonalInfomation newInstance(String param1, String param2) { + PersonalInfomation fragment = new PersonalInfomation(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_personal_infomation, container, false); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/QuitCourse_Activity.java b/COURCE/app/src/main/java/com/example/cource/QuitCourse_Activity.java new file mode 100644 index 0000000..a9d24a3 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/QuitCourse_Activity.java @@ -0,0 +1,105 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class QuitCourse_Activity extends AppCompatActivity { + private Long userId; + private EditText Edit; + private Button Bt_quit; + private Callback callback = new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()){ + final String body = response.body().string(); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone newUserResponse = gson.fromJson(body,jsonType); + int code = newUserResponse.getCode(); + Log.println(Log.INFO,"cide",Integer.toString(code)+newUserResponse.getMsg()); + if (code ==200){ + + Toast.makeText(getApplicationContext(),"退课成功",Toast.LENGTH_SHORT).show(); + }else Toast.makeText(getApplicationContext(),newUserResponse.getMsg(),Toast.LENGTH_SHORT).show(); + } + }); + + }else Log.println(Log.INFO,"cide",Integer.toString(response.code())+response.message()); + + + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_quit_course); + Intent intent =getIntent(); + userId = intent.getLongExtra("userId",0); + + Edit =findViewById(R.id.Edit_courseid_quit); + Bt_quit = findViewById(R.id.Bt_quit_out); + Bt_quit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + quit(); + } + }); + } + void quit(){ + + new Thread(new Runnable() { + @Override + public void run() { + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + String urlParam ="?"+"courseId="+Edit.getText().toString()+"&userId="+userId; + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), urlParam); + Request request = new Request.Builder().url(Constans.ReqUrl+Constans.studentdrop+urlParam) + .headers(Headers.of(map1)) + .delete(requestBody).build(); + try { + OkHttpClient client = new OkHttpClient() ; + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/RecordAdapter.java b/COURCE/app/src/main/java/com/example/cource/RecordAdapter.java new file mode 100644 index 0000000..3a9eebe --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/RecordAdapter.java @@ -0,0 +1,58 @@ +package com.example.cource; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.List; + +public class RecordAdapter extends ArrayAdapter { + private List records; + private Context mContext; + private int resourseId; + + public RecordAdapter(Context context,int resourseId,List recordList){ + + super(context,resourseId,recordList); + this.mContext = context; + this.records=recordList; + this.resourseId = resourseId; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + record r = getItem(position); + View view; + + final ViewHolder vh; + if(convertView==null){ + view = LayoutInflater.from(getContext()).inflate(resourseId,parent,false); + vh= new ViewHolder(); + vh.college = view.findViewById(R.id.college); + vh.name = view.findViewById(R.id.name_course); + vh.course_id = view.findViewById(R.id.id_course); + view.setTag(vh); + }else{ + view = convertView; + vh = (ViewHolder) view.getTag(); + } + + vh.course_id.setText(Integer.toString(r.getCourseId())); + vh.college.setText(r.getCollegeName()); + vh.name.setText(r.getCourseName()); + + return view; + } + class ViewHolder{ + TextView name; + TextView course_id; + TextView college; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/RegisterActivity.java b/COURCE/app/src/main/java/com/example/cource/RegisterActivity.java new file mode 100644 index 0000000..4df8806 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/RegisterActivity.java @@ -0,0 +1,138 @@ +package com.example.cource; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONStringer; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +import okhttp3.Call; +import okhttp3.FormBody; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.internal.http2.Header; +import okio.BufferedSink; + +public class RegisterActivity extends AppCompatActivity { + + private EditText user,passwd,role; + private Button register; + private okhttp3.Callback callback =new okhttp3.Callback(){ + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response.isSuccessful()){ + final String body = response.body().string(); + Log.println(Log.INFO,"OK",body); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone newUserResponse = gson.fromJson(body,jsonType); + Userinfo u =newUserResponse.getData(); + int c = newUserResponse.getCode(); + if (u==null){ + Log.println(Log.INFO,"code",Integer.toString(c)); + if (c==200){ + Toast.makeText(getApplicationContext(),"注册成功",Toast.LENGTH_SHORT).show(); + }else Toast.makeText(getApplicationContext(),newUserResponse.getMsg(),Toast.LENGTH_SHORT).show(); + + } + + } + }); + }else { + String msg = response.message(); + int code = response.code(); + Log.println(Log.ERROR,"error",String.valueOf(code)+" "+msg); + } + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register); + user = findViewById(R.id.user_register); + passwd = findViewById(R.id.Pwd_register); + role = findViewById(R.id.Role_register); + register = findViewById(R.id.button_register); + + register.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + RegisterIn(); + } + }); + } + void RegisterIn(){ + String username = String.valueOf(user.getText()); + String password = String.valueOf(passwd.getText()); + String rol = String.valueOf(role.getText()); + Log.println(Log.INFO,"username",String.valueOf(username)); + + new Thread(new Runnable() { + @Override + public void run() { + + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + JSONObject jsonObject = new JSONObject(); + Log.println(Log.ERROR,"jsontest","this is"); + try { + jsonObject.put("password",password); + jsonObject.put("roleId",Integer.valueOf(rol)); + jsonObject.put("userName",username); + } catch (JSONException e) { + e.printStackTrace(); + } + String json = "password"+password+","+"roleId"+rol+","+"userName"+username; + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), String.valueOf(jsonObject)); + Request request1 = new Request.Builder().url(Constans.ReqUrl+Constans.userrigister).headers(Headers.of(map1)) + .post(requestBody) + .build(); + + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request1).enqueue(callback); + }catch (NetworkOnMainThreadException e){ + e.printStackTrace(); + Log.println(Log.ERROR,"error","error"); + } + } + }).start(); + + + + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/ResponseData.java b/COURCE/app/src/main/java/com/example/cource/ResponseData.java new file mode 100644 index 0000000..e89182a --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/ResponseData.java @@ -0,0 +1,40 @@ +package com.example.cource; + +public class ResponseData { + private T records; + private int total; + private int size; + private int current; + + public T getRecords() { + return records; + } + + public void setRecords(T records) { + this.records = records; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public int getCurrent() { + return current; + } + + public void setCurrent(int current) { + this.current = current; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/SignAdapter.java b/COURCE/app/src/main/java/com/example/cource/SignAdapter.java new file mode 100644 index 0000000..bb3ffe2 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/SignAdapter.java @@ -0,0 +1,57 @@ +package com.example.cource; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.List; + +public class SignAdapter extends ArrayAdapter { + private List records; + private Context mContext; + private int resourseId; + public SignAdapter(Context context,int resourseId,List recordList){ + + super(context,resourseId,recordList); + this.mContext = context; + this.records=recordList; + this.resourseId = resourseId; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + signInfo r = getItem(position); + View view; + + final ViewHolder vh; + if(convertView==null){ + view = LayoutInflater.from(getContext()).inflate(resourseId,parent,false); + vh= new ViewHolder(); + vh.name = view.findViewById(R.id.college); + vh.course_id = view.findViewById(R.id.name_course); + vh.courseNum = view.findViewById(R.id.id_course); + view.setTag(vh); + }else{ + view = convertView; + vh = (ViewHolder) view.getTag(); + } + + vh.course_id.setText("课程ID:"+Long.toString(r.getCourseId())); + vh.courseNum.setText(Integer.toString(r.getCourseNum())); + vh.name.setText(r.getCourseName()); + + return view; + } + class ViewHolder{ + TextView name; + TextView course_id; + TextView courseNum; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/SignAdapterStudent.java b/COURCE/app/src/main/java/com/example/cource/SignAdapterStudent.java new file mode 100644 index 0000000..5278e51 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/SignAdapterStudent.java @@ -0,0 +1,57 @@ +package com.example.cource; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.List; + +public class SignAdapterStudent extends ArrayAdapter { + private List records; + private Context mContext; + private int resourseId; + public SignAdapterStudent(Context context,int resourseId,List recordList){ + + super(context,resourseId,recordList); + this.mContext = context; + this.records=recordList; + this.resourseId = resourseId; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + SignInfo_student r = getItem(position); + View view; + + final ViewHolder vh; + if(convertView==null){ + view = LayoutInflater.from(getContext()).inflate(resourseId,parent,false); + vh= new ViewHolder(); + vh.name = view.findViewById(R.id.name_course); + vh.college = view.findViewById(R.id.college); + vh.course_id = view.findViewById(R.id.id_course); + view.setTag(vh); + }else{ + view = convertView; + vh = (ViewHolder) view.getTag(); + } + + vh.course_id.setText(r.getCourseAddr()); + vh.college.setText("用户签到id:"+r.getUserSignId()); + vh.name.setText(r.getCourseName()); + + return view; + } + class ViewHolder{ + TextView name; + TextView course_id; + TextView college; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/SignInfo_student.java b/COURCE/app/src/main/java/com/example/cource/SignInfo_student.java new file mode 100644 index 0000000..1548cef --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/SignInfo_student.java @@ -0,0 +1,41 @@ +package com.example.cource; + +public class SignInfo_student { + + private String courseName; + private String courseAddr; + private String createTime; + private String userSignId; + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public String getCourseAddr() { + return courseAddr; + } + + public void setCourseAddr(String courseAddr) { + this.courseAddr = courseAddr; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUserSignId() { + return userSignId; + } + + public void setUserSignId(String userSignId) { + this.userSignId = userSignId; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/Sign_CreateActivity.java b/COURCE/app/src/main/java/com/example/cource/Sign_CreateActivity.java new file mode 100644 index 0000000..c74033b --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Sign_CreateActivity.java @@ -0,0 +1,137 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Locale; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class Sign_CreateActivity extends AppCompatActivity { + + private Long startTime,terminalTime; + private Button add_button; + private EditText beginT,endT,Addr,sign; + private String courseAddr,courseName; + private int signCode,courseId,total; + private Long beginTime,endTime,userId; + private Callback callback = new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG","Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response.isSuccessful()){ + final String body = response.body().string(); + Log.println(Log.INFO,"OK",body); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>(){}.getType(); + BaseRespone newUserResponse = gson.fromJson(body,jsonType); + String u= newUserResponse.getData(); + int c = newUserResponse.getCode(); + if (c==200){ + Log.println(Log.INFO,"code",Integer.toString(c)); + Toast.makeText(getApplicationContext(),"发起成功",Toast.LENGTH_SHORT).show(); + }else Toast.makeText(getApplicationContext(),"发起签到失败",Toast.LENGTH_SHORT).show(); + } + }); + } + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sign_create); + Intent intent = getIntent(); + courseName = intent.getStringExtra("courseName"); + courseId=intent.getIntExtra("courseId",0); + userId=intent.getLongExtra("userId",0); + beginT=findViewById(R.id.beginTime); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒", Locale.getDefault()); + startTime = System.currentTimeMillis(); + terminalTime = startTime+300000; + beginT.setText(simpleDateFormat.format(startTime)); + endT=findViewById(R.id.ed_endtime); + endT.setText(simpleDateFormat.format(terminalTime)); + Addr = findViewById(R.id.courseAddr); + sign = findViewById(R.id.signcode); + add_button = findViewById(R.id.add_button); + Log.println(Log.INFO,"userId",Long.toString(userId)); + Log.println(Log.INFO,"courseId",Long.toString(courseId)); + + add_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + add_sign(); + } + }); + } + void add_sign(){ + new Thread(new Runnable() { + @Override + public void run() { + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + JSONObject jsonObject = new JSONObject(); + Log.println(Log.ERROR,"jsontest","this is"); + try { + jsonObject.put("courseName",courseName); + jsonObject.put("userId",userId); + jsonObject.put("courseId",courseId); + jsonObject.put("courseAddr",Addr.getText().toString()); + jsonObject.put("beginTime",startTime); + jsonObject.put("endTime",terminalTime); + jsonObject.put("signCode",sign.getText().toString()); + jsonObject.put("total",99); + } catch (JSONException e) { + e.printStackTrace(); + } + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),String.valueOf(jsonObject)); + Request request = new Request.Builder().url(Constans.ReqUrl+Constans.teacherinitiate) + .headers(Headers.of(map1)) + .post(requestBody) + .build(); + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/Sign_inActivity.java b/COURCE/app/src/main/java/com/example/cource/Sign_inActivity.java new file mode 100644 index 0000000..afc272c --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Sign_inActivity.java @@ -0,0 +1,126 @@ +package com.example.cource; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.NetworkOnMainThreadException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class Sign_inActivity extends AppCompatActivity { + + private Long userId; + private String signCode; + private EditText ed_sign,userSignId; + private Button bt_sign; + private final Callback callback=new okhttp3.Callback() { + + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAG", "Failed to connect server!"); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()) { + final String body = response.body().string(); + Log.println(Log.INFO, "OK", body); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + Type jsonType = new TypeToken>() {}.getType(); + BaseRespone newUserResponse = gson.fromJson(body, jsonType); + int code = newUserResponse.getCode(); + if (code==200){ + Toast.makeText(getApplicationContext(),"签到成功",Toast.LENGTH_SHORT).show(); + }else { + Toast.makeText(getApplicationContext(),"签到失败",Toast.LENGTH_SHORT).show(); + } + } + }); + } else { + String msg = response.message(); + int code = response.code(); + Log.println(Log.ERROR, "error", String.valueOf(code) + " " + msg); + } + } + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sign_in); + Intent intent = getIntent(); + userId = intent.getLongExtra("userId",0); + userSignId = findViewById(R.id.userSignId); + ed_sign = findViewById(R.id.Edit_Signcode); + bt_sign =findViewById(R.id.Bt_sign_in); + bt_sign.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sign_in(); + } + }); + } + void sign_in(){ + new Thread(new Runnable() { + @Override + public void run() { + + HashMap map1 = new HashMap(); + map1.put("Accept",Constans.Accept); + map1.put("Content-Type",Constans.Content_Type); + map1.put("appId",Constans.appId); + map1.put("appSecret",Constans.appSecret); + + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("signCode",ed_sign.getText().toString()); + jsonObject.put("userId",userId); + jsonObject.put("userSignId",userSignId.getText().toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),String.valueOf(jsonObject)); + Request request1 = new Request.Builder().url(Constans.ReqUrl+Constans.studentsign) + .headers(Headers.of(map1)) + .post(requestBody) + .build(); + + try { + OkHttpClient client = new OkHttpClient(); + client.newCall(request1).enqueue(callback); + }catch (NetworkOnMainThreadException e){ + e.printStackTrace(); + Log.println(Log.ERROR,"error","error"); + } + } + }).start(); + } +} \ No newline at end of file diff --git a/COURCE/app/src/main/java/com/example/cource/UserRequest.java b/COURCE/app/src/main/java/com/example/cource/UserRequest.java new file mode 100644 index 0000000..1ddc927 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/UserRequest.java @@ -0,0 +1,43 @@ +package com.example.cource; + +public class UserRequest { + private String username; + private String password; + private int roleId; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + String retvalue; + retvalue = "?"+"password="+password+"&username="+username; + return retvalue; + } + + public String toRegisterString(){ + String retvalue; + retvalue = "?"+"password="+password+"&username="+username+"&roleId="+roleId; + return retvalue; + } + public int getRoleId() { + return roleId; + } + + public void setRoleId(int roleId) { + this.roleId = roleId; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/Userinfo.java b/COURCE/app/src/main/java/com/example/cource/Userinfo.java new file mode 100644 index 0000000..dd70145 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/Userinfo.java @@ -0,0 +1,133 @@ +package com.example.cource; + + + +public class Userinfo { + private long id; + private String appKey; + private String userName; + private String roleId; + private String realName; + private long idNumber; + private String collegeName; + private boolean gender=true; + private String phone; + private String email; + private String avatar; + private String inSchoolTime; + private String createTime; + private String lastUpdateTime; + + public String getCollegeName() { + return collegeName; + } + + public void setCollegeName(String collegeName) { + this.collegeName = collegeName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean isGender() { + return gender; + } + + public void setGender(boolean gender) { + this.gender = gender; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getIdNumber() { + return idNumber; + } + + public void setIdNumber(long idNumber) { + this.idNumber = idNumber; + } + + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public void setInSchoolTime(String inSchoolTime) { + this.inSchoolTime = inSchoolTime; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(String lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } + + public String getAvatar() { + return avatar; + } + + public String getInSchoolTime() { + return inSchoolTime; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/record.java b/COURCE/app/src/main/java/com/example/cource/record.java new file mode 100644 index 0000000..32b3d19 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/record.java @@ -0,0 +1,40 @@ +package com.example.cource; + +public class record { + private int courseId; + private String courseName; + private String coursePhoto; + private String collegeName; + + public int getCourseId() { + return courseId; + } + + public void setCourseId(int courseId) { + this.courseId = courseId; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public String getCoursePhoto() { + return coursePhoto; + } + + public void setCoursePhoto(String coursePhoto) { + this.coursePhoto = coursePhoto; + } + + public String getCollegeName() { + return collegeName; + } + + public void setCollegeName(String collegeName) { + this.collegeName = collegeName; + } +} diff --git a/COURCE/app/src/main/java/com/example/cource/signInfo.java b/COURCE/app/src/main/java/com/example/cource/signInfo.java new file mode 100644 index 0000000..bb65129 --- /dev/null +++ b/COURCE/app/src/main/java/com/example/cource/signInfo.java @@ -0,0 +1,33 @@ +package com.example.cource; + +public class signInfo { + private String courseName; + private Long courseId; + private int courseNum; + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public Long getCourseId() { + return courseId; + } + + public void setCourseId(Long courseId) { + this.courseId = courseId; + } + + public int getCourseNum() { + return courseNum; + } + + public void setCourseNum(int courseNum) { + this.courseNum = courseNum; + } + + +} diff --git a/COURCE/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/COURCE/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/COURCE/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/COURCE/app/src/main/res/drawable/add.png b/COURCE/app/src/main/res/drawable/add.png new file mode 100644 index 0000000000000000000000000000000000000000..314f402686966b0604e4d5d8d56f2497990b7752 GIT binary patch literal 7591 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 literal 0 HcmV?d00001 diff --git a/COURCE/app/src/main/res/drawable/group1.png b/COURCE/app/src/main/res/drawable/group1.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e0715cd42bb81272be917e183da8bdc2727a01 GIT binary patch literal 3391 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 + + diff --git a/COURCE/app/src/main/res/drawable/ic_baseline_lock_24.xml b/COURCE/app/src/main/res/drawable/ic_baseline_lock_24.xml new file mode 100644 index 0000000..ff65e27 --- /dev/null +++ b/COURCE/app/src/main/res/drawable/ic_baseline_lock_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/COURCE/app/src/main/res/drawable/ic_baseline_lock_open_24.xml b/COURCE/app/src/main/res/drawable/ic_baseline_lock_open_24.xml new file mode 100644 index 0000000..0e8905c --- /dev/null +++ b/COURCE/app/src/main/res/drawable/ic_baseline_lock_open_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/COURCE/app/src/main/res/drawable/ic_baseline_person_24.xml b/COURCE/app/src/main/res/drawable/ic_baseline_person_24.xml new file mode 100644 index 0000000..ccfe46a --- /dev/null +++ b/COURCE/app/src/main/res/drawable/ic_baseline_person_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/COURCE/app/src/main/res/drawable/ic_launcher_background.xml b/COURCE/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/COURCE/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/COURCE/app/src/main/res/drawable/introduction.png b/COURCE/app/src/main/res/drawable/introduction.png new file mode 100644 index 0000000000000000000000000000000000000000..595bc6300bfdbaf5193865d2e055a6461a199997 GIT binary patch literal 5249 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 literal 0 HcmV?d00001 diff --git a/COURCE/app/src/main/res/drawable/member.png b/COURCE/app/src/main/res/drawable/member.png new file mode 100644 index 0000000000000000000000000000000000000000..a28e1fac3bbdadf0de2a4136f5f142e6f9a90d35 GIT binary patch literal 7456 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

P!c@+MVz81Lxe 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 literal 0 HcmV?d00001 diff --git a/COURCE/app/src/main/res/drawable/personal.png b/COURCE/app/src/main/res/drawable/personal.png new file mode 100644 index 0000000000000000000000000000000000000000..9491158ca7df194d35958bd2b578b648c3117d2f GIT binary patch literal 8486 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 literal 0 HcmV?d00001 diff --git a/COURCE/app/src/main/res/drawable/teacher.png b/COURCE/app/src/main/res/drawable/teacher.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9275e284f3c1561ce09b26967b18165d5364f6 GIT binary patch literal 3994 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 Gp!^3Wt^(5l literal 0 HcmV?d00001 diff --git a/COURCE/app/src/main/res/layout/activity_course.xml b/COURCE/app/src/main/res/layout/activity_course.xml new file mode 100644 index 0000000..a9d9b60 --- /dev/null +++ b/COURCE/app/src/main/res/layout/activity_course.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/COURCE/app/src/main/res/layout/activity_course_create.xml b/COURCE/app/src/main/res/layout/activity_course_create.xml new file mode 100644 index 0000000..a905871 --- /dev/null +++ b/COURCE/app/src/main/res/layout/activity_course_create.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + +