commit 941f6b3c5287f5200928526326075c18ea716dbc Author: 呗 呗 <2026952257@qq.com> Date: Thu Jun 2 16:37:27 2022 +0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.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/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 0000000..976d6b5 --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..19bb981 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..526b4c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..60979e7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/S.T.Link.jks b/S.T.Link.jks new file mode 100644 index 0000000..86a14bd Binary files /dev/null and b/S.T.Link.jks differ diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..20323ca --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,92 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.example.stlink" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + ndk { + // 设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so) + abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64" + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures { + viewBinding true + } + + sourceSets { + main { + jniLibs.srcDir 'libs' + } + } +} + + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.navigation:navigation-fragment:2.3.5' + implementation 'androidx.navigation:navigation-ui:2.3.5' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' + implementation files('libs\\BaiduLBS_Android.jar') + implementation 'androidx.test:monitor:1.4.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation 'com.google.android.material:material:1.6.0' + implementation "androidx.viewpager2:viewpager2:1.0.0" + + def nav_version = "2.1.0" + implementation "androidx.navigation:navigation-fragment:$nav_version" + implementation "androidx.navigation:navigation-ui:$nav_version" + + // Java language implementation + implementation "androidx.fragment:fragment:1.4.1" + + implementation 'com.squareup.okhttp3:okhttp:3.10.0' + implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.github.bumptech.glide:glide:4.11.0' + + // https://mvnrepository.com/artifact/org.ligboy.retrofit2/converter-fastjson-android + implementation 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0' + + //图片选择器 + implementation 'com.github.donkingliang:ImageSelector:2.2.1' + + //浮动按钮 + implementation 'gdut.bsx:xdraglayout:1.1.1' + + //二维码的生成与解析 + // https://mvnrepository.com/artifact/com.google.zxing/core + implementation 'com.google.zxing:core:3.5.0' + implementation 'com.journeyapps:zxing-android-embedded:4.1.0' + + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" + + + + +} \ No newline at end of file diff --git a/app/libs/BaiduLBS_Android.jar b/app/libs/BaiduLBS_Android.jar new file mode 100644 index 0000000..7161cb5 Binary files /dev/null and b/app/libs/BaiduLBS_Android.jar differ diff --git a/app/libs/arm64-v8a/libBaiduMapSDK_base_v7_5_0.so b/app/libs/arm64-v8a/libBaiduMapSDK_base_v7_5_0.so new file mode 100644 index 0000000..71cebac Binary files /dev/null and b/app/libs/arm64-v8a/libBaiduMapSDK_base_v7_5_0.so differ diff --git a/app/libs/arm64-v8a/libBaiduMapSDK_map_v7_5_0.so b/app/libs/arm64-v8a/libBaiduMapSDK_map_v7_5_0.so new file mode 100644 index 0000000..8b1b578 Binary files /dev/null and b/app/libs/arm64-v8a/libBaiduMapSDK_map_v7_5_0.so differ diff --git a/app/libs/arm64-v8a/libgnustl_shared.so b/app/libs/arm64-v8a/libgnustl_shared.so new file mode 100644 index 0000000..be99b75 Binary files /dev/null and b/app/libs/arm64-v8a/libgnustl_shared.so differ diff --git a/app/libs/arm64-v8a/libindoor.so b/app/libs/arm64-v8a/libindoor.so new file mode 100644 index 0000000..bfb6f75 Binary files /dev/null and b/app/libs/arm64-v8a/libindoor.so differ diff --git a/app/libs/arm64-v8a/liblocSDK8b.so b/app/libs/arm64-v8a/liblocSDK8b.so new file mode 100644 index 0000000..9bd868a Binary files /dev/null and b/app/libs/arm64-v8a/liblocSDK8b.so differ diff --git a/app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_5_0.so b/app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_5_0.so new file mode 100644 index 0000000..5e43df2 Binary files /dev/null and b/app/libs/armeabi-v7a/libBaiduMapSDK_base_v7_5_0.so differ diff --git a/app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_5_0.so b/app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_5_0.so new file mode 100644 index 0000000..c756afc Binary files /dev/null and b/app/libs/armeabi-v7a/libBaiduMapSDK_map_v7_5_0.so differ diff --git a/app/libs/armeabi-v7a/libgnustl_shared.so b/app/libs/armeabi-v7a/libgnustl_shared.so new file mode 100644 index 0000000..96c22a2 Binary files /dev/null and b/app/libs/armeabi-v7a/libgnustl_shared.so differ diff --git a/app/libs/armeabi-v7a/libindoor.so b/app/libs/armeabi-v7a/libindoor.so new file mode 100644 index 0000000..b59be91 Binary files /dev/null and b/app/libs/armeabi-v7a/libindoor.so differ diff --git a/app/libs/armeabi-v7a/liblocSDK8b.so b/app/libs/armeabi-v7a/liblocSDK8b.so new file mode 100644 index 0000000..aa90e76 Binary files /dev/null and b/app/libs/armeabi-v7a/liblocSDK8b.so differ diff --git a/app/libs/armeabi/libBaiduMapSDK_base_v7_5_0.so b/app/libs/armeabi/libBaiduMapSDK_base_v7_5_0.so new file mode 100644 index 0000000..a1831f1 Binary files /dev/null and b/app/libs/armeabi/libBaiduMapSDK_base_v7_5_0.so differ diff --git a/app/libs/armeabi/libBaiduMapSDK_map_v7_5_0.so b/app/libs/armeabi/libBaiduMapSDK_map_v7_5_0.so new file mode 100644 index 0000000..21b6050 Binary files /dev/null and b/app/libs/armeabi/libBaiduMapSDK_map_v7_5_0.so differ diff --git a/app/libs/armeabi/libgnustl_shared.so b/app/libs/armeabi/libgnustl_shared.so new file mode 100644 index 0000000..5cf6d20 Binary files /dev/null and b/app/libs/armeabi/libgnustl_shared.so differ diff --git a/app/libs/armeabi/libindoor.so b/app/libs/armeabi/libindoor.so new file mode 100644 index 0000000..a0879cf Binary files /dev/null and b/app/libs/armeabi/libindoor.so differ diff --git a/app/libs/armeabi/liblocSDK8b.so b/app/libs/armeabi/liblocSDK8b.so new file mode 100644 index 0000000..4083291 Binary files /dev/null and b/app/libs/armeabi/liblocSDK8b.so differ diff --git a/app/libs/x86/libBaiduMapSDK_base_v7_5_0.so b/app/libs/x86/libBaiduMapSDK_base_v7_5_0.so new file mode 100644 index 0000000..5d3222f Binary files /dev/null and b/app/libs/x86/libBaiduMapSDK_base_v7_5_0.so differ diff --git a/app/libs/x86/libBaiduMapSDK_map_v7_5_0.so b/app/libs/x86/libBaiduMapSDK_map_v7_5_0.so new file mode 100644 index 0000000..5945657 Binary files /dev/null and b/app/libs/x86/libBaiduMapSDK_map_v7_5_0.so differ diff --git a/app/libs/x86/libgnustl_shared.so b/app/libs/x86/libgnustl_shared.so new file mode 100644 index 0000000..1eae31c Binary files /dev/null and b/app/libs/x86/libgnustl_shared.so differ diff --git a/app/libs/x86/libindoor.so b/app/libs/x86/libindoor.so new file mode 100644 index 0000000..1de0a2c Binary files /dev/null and b/app/libs/x86/libindoor.so differ diff --git a/app/libs/x86/liblocSDK8b.so b/app/libs/x86/liblocSDK8b.so new file mode 100644 index 0000000..ca234f1 Binary files /dev/null and b/app/libs/x86/liblocSDK8b.so differ diff --git a/app/libs/x86_64/libBaiduMapSDK_base_v7_5_0.so b/app/libs/x86_64/libBaiduMapSDK_base_v7_5_0.so new file mode 100644 index 0000000..053f32a Binary files /dev/null and b/app/libs/x86_64/libBaiduMapSDK_base_v7_5_0.so differ diff --git a/app/libs/x86_64/libBaiduMapSDK_map_v7_5_0.so b/app/libs/x86_64/libBaiduMapSDK_map_v7_5_0.so new file mode 100644 index 0000000..ad2885e Binary files /dev/null and b/app/libs/x86_64/libBaiduMapSDK_map_v7_5_0.so differ diff --git a/app/libs/x86_64/libgnustl_shared.so b/app/libs/x86_64/libgnustl_shared.so new file mode 100644 index 0000000..0149273 Binary files /dev/null and b/app/libs/x86_64/libgnustl_shared.so differ diff --git a/app/libs/x86_64/libindoor.so b/app/libs/x86_64/libindoor.so new file mode 100644 index 0000000..80a00c6 Binary files /dev/null and b/app/libs/x86_64/libindoor.so differ diff --git a/app/libs/x86_64/liblocSDK8b.so b/app/libs/x86_64/liblocSDK8b.so new file mode 100644 index 0000000..ff464c5 Binary files /dev/null and b/app/libs/x86_64/liblocSDK8b.so differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/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/app/release/app-release.aab b/app/release/app-release.aab new file mode 100644 index 0000000..1e51cec Binary files /dev/null and b/app/release/app-release.aab differ diff --git a/app/src/androidTest/java/com/example/stlink/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/stlink/ExampleInstrumentedTest.java new file mode 100644 index 0000000..100b7af --- /dev/null +++ b/app/src/androidTest/java/com/example/stlink/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.stlink; + +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.stlink", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0f88a0d --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/LaunchActivity.java b/app/src/main/java/com/example/stlink/LaunchActivity.java new file mode 100644 index 0000000..01af684 --- /dev/null +++ b/app/src/main/java/com/example/stlink/LaunchActivity.java @@ -0,0 +1,69 @@ +package com.example.stlink; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.widget.ImageView; + +import com.example.stlink.activitys.IdChooseActivity; +import com.example.stlink.utils.CommonUtils; + +/** + * app加载活动 + */ +public class LaunchActivity extends AppCompatActivity { + + private ImageView mClipLeftLoadingImageView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_launch); + + +// //去除当前活动标题栏 +// Objects.requireNonNull(getSupportActionBar()).hide(); + + mClipLeftLoadingImageView = findViewById(R.id.iv_login_loading); + mClipLeftLoadingImageView.setImageLevel(0); + + //修改状态栏字体颜色 + CommonUtils.changeStatusBar(this); + +// //延时任务,进度条加载 +// handler.postDelayed(runnable, 500); + + //延时加载 + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + Intent intent = new Intent(LaunchActivity.this, IdChooseActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + }, 1000);//3秒后执行Runnable中的run方法 + + } + + +// //开启一个子线程用作进度条加载 +// private int mUnmber = 0; +// private Handler handler = new Handler(); +// Runnable runnable = new Runnable() { +// @Override +// public void run() { +// if(mUnmber <= 10000){ +// mClipLeftLoadingImageView.getDrawable().setLevel(mUnmber); +// handler.postDelayed(runnable, 20); +// mUnmber += 100; +// } +// +// //进度条加载完毕之后,跳转到身份选择活动 +// Intent intent = new Intent(LaunchActivity.this, IdChooseActivity.class); +// startActivity(intent); +// } +// }; +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/activitys/IdChooseActivity.java b/app/src/main/java/com/example/stlink/activitys/IdChooseActivity.java new file mode 100644 index 0000000..bfa0988 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/IdChooseActivity.java @@ -0,0 +1,134 @@ +package com.example.stlink.activitys; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.utils.CommonUtils; + +/** + * 登录身份选择 + */ +public class IdChooseActivity extends AppCompatActivity { + + private Boolean isExit = false; // 定义一个变量,来标识是否退出 + Handler mHandler; // 3秒内连续点击两个退出键返回 + + private Button stuLoginCho; + private Button teaLoginCho; + + private Bundle bundle; + private Intent intentIdCho; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login_identity_choose); + + initView(); + + // 消息延时处理,将退出标志设置未为false + mHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + isExit = false; + } + }; + } + + /** + * 初始化布局 + */ + public void initView(){ + //修改状态栏字体颜色 + CommonUtils.changeStatusBar(this); + + stuLoginCho = findViewById(R.id.login_b_stu); + teaLoginCho = findViewById(R.id.login_b_tea); + + bundle = new Bundle(); + + setOnclickListener(); + } + + /** + * 设置按钮点击监听事件 + */ + public void setOnclickListener(){ + // 选择学生端登录 + stuLoginCho.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + intentIdCho = new Intent(IdChooseActivity.this, LoginActivity.class); + bundle.putInt(ModelFieldConstants.ROLE_ID, 0); + intentIdCho.putExtras(bundle); + startActivity(intentIdCho); + } + }); + + // 选择教师端登录 + teaLoginCho.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + intentIdCho = new Intent(IdChooseActivity.this, LoginActivity.class); + bundle.putInt(ModelFieldConstants.ROLE_ID, 1); + intentIdCho.putExtras(bundle); + startActivity(intentIdCho); + } + }); + } + + + /** + * 1、当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法。 + * @param keyCode 自定义的标识 + * @param event 用户事件 + * @return 是否点击系统返回键 + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(keyCode == KeyEvent.KEYCODE_BACK){ + exit(); + return false; + } + return super.onKeyDown(keyCode, event); + } + + /** + * 2、在exit方法中,会首先判断isExit的值,如果为false的话,则置为true, + * 同时会弹出提示,并在3000毫秒(3秒)后发出一个消息,在Handler中将此值还原成false。 + * 如果在发送消息间隔的2秒内,再次按了BACK键,则再次执行exit方法,此时isExit的值已 + * 为true,则会执行退出的方法。 + */ + public void exit(){ + if (!isExit) { + isExit = true; + Toast toast = Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT); + toast.show(); + toast.setGravity(Gravity.CENTER, 0, 0); + //利用handler延迟发送更改状态信息,3000==3 + mHandler.sendEmptyMessageDelayed(0, 3000); + } else { + //在后台运行程序,不退出程序,只返回桌面 + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + startActivity(intent); + //退出程序代码 +// finish(); //结束程序 +// System.exit(0); //退出程序 + } + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/LoginActivity.java b/app/src/main/java/com/example/stlink/activitys/LoginActivity.java new file mode 100644 index 0000000..aa93154 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/LoginActivity.java @@ -0,0 +1,136 @@ +package com.example.stlink.activitys; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.activityUtil.LoginUtil; + +/** + * 学生端登录 + */ +public class LoginActivity extends AppCompatActivity { + + + private EditText etPwd; + private EditText etAccount; + private CheckBox cbRememberPwd; + private Button btLogin; + private TextView lgRegister; + private TextView tvLgTitle; + private ImageView lgUserIcon; + + private Integer roleId; + private Bundle bundle; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + + initView(); + + } + + /** + * 初始化当前页面 + */ + private void initView(){ + //修改状态栏字体颜色 + CommonUtils.changeStatusBar(this); + + etPwd = findViewById(R.id.pwd_lg); + etAccount = findViewById(R.id.id_lg); + cbRememberPwd = findViewById(R.id.lg_rememberPsd); + btLogin = findViewById(R.id.bt_login); + lgRegister = findViewById(R.id.lg_register); + tvLgTitle = findViewById(R.id.tv_lg_title); + lgUserIcon = findViewById(R.id.lg_userIcon); + + bundle = getIntent().getExtras(); + roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID); + + if(roleId == 1){ + tvLgTitle.setText("教师端登录"); + lgUserIcon.setImageResource(R.mipmap.teacher); + } + + //加载用户id,密码到页面 + initLogin(etAccount, etPwd, cbRememberPwd); + //为当前页面按钮添加点击监听事件 + setOnclickListener(); + } + + /** + * 添加按钮点击监听事件 + */ + private void setOnclickListener(){ + + LoginUtil.userLogin(LoginActivity.this, btLogin, etAccount, etPwd, cbRememberPwd ); + + //用户注册 + lgRegister.setOnClickListener(new View.OnClickListener() { + @SuppressLint("ResourceAsColor") + @Override + public void onClick(View v) { + lgRegister.setTextColor(R.color.crimson); + lgRegister.getPaint().setUnderlineText(true); + Intent intent = new Intent(LoginActivity.this, RegisterActivity.class); + intent.putExtras(bundle); + startActivity(intent); + } + }); + } + + /** + * 初始化登录界面 + * 读取本地账户密码信息,并加载到界面中 + * @param etAccount 账户昵称输入 + * @param etPwd 密码输入 + * @param cbRememberPwd 密码是否保存选择框 + */ + public void initLogin(EditText etAccount, EditText etPwd, CheckBox cbRememberPwd){ + 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 account = spFile.getString(accountKey, null); + String password = spFile.getString(passwordKey, null); + Boolean rememberPassword = spFile.getBoolean(rememberPasswordKey, false); + if(account != null && !TextUtils.isEmpty(account)){ + etAccount.setText(account); + etAccount.setSelection(account.length()); + } + if (password != null && !TextUtils.isEmpty(password)) { + etPwd.setText(CommonUtils.encryptAndDencrypt(password)); + } + cbRememberPwd.setChecked(rememberPassword); + } + +} diff --git a/app/src/main/java/com/example/stlink/activitys/MainActivity.java b/app/src/main/java/com/example/stlink/activitys/MainActivity.java new file mode 100644 index 0000000..aa1b9e2 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/MainActivity.java @@ -0,0 +1,97 @@ +package com.example.stlink.activitys; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.os.Bundle; +import android.view.KeyEvent; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.example.stlink.R; +import com.example.stlink.fragments.StuClassListFragment; +import com.example.stlink.fragments.StuHomeFragment; +import com.example.stlink.fragments.TeaCourseListFragment; +import com.example.stlink.fragments.TeaHomeFragment; +import com.example.stlink.fragments.UserInfoFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.utils.activityUtil.MainActivityUtil; +import com.google.android.material.bottomnavigation.BottomNavigationView; + +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends AppCompatActivity { + + private MainActivityUtil mainActivityUtil; + private BottomNavigationView bottomNavigationView; + private Integer roleId; + private Bundle bundle; + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + initView(); + initPager(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + @SuppressLint("RestrictedApi") + private void initView(){ + + bottomNavigationView = findViewById(R.id.bottom_navigation_view); + + mainActivityUtil = new MainActivityUtil(this); + mainActivityUtil.initView(); + + bundle = getIntent().getExtras(); + roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID); + + if(roleId == 0){ + bottomNavigationView.getMenu().getItem(2).setIcon(R.mipmap.student); + bottomNavigationView.getMenu().getItem(1).setTitle("班级消息"); + } + + } + + /** + * 绑定页面 + */ + private void initPager(){ + List list = new ArrayList<>(); + if(roleId == 1){ + TeaHomeFragment teaHomeFragment = TeaHomeFragment.newInstance("主页",this,findViewById(R.id.nav_host_fragment)); + TeaCourseListFragment teaCourseListFragment = TeaCourseListFragment.newInstance("班级消息", this); + list.add(teaHomeFragment); + list.add(teaCourseListFragment); + }else{ + StuHomeFragment stuHomeFragment = StuHomeFragment.newInstance("主页"); + StuClassListFragment stuClassListFragment = StuClassListFragment.newInstance("班级消息", MainActivity.this); + list.add(stuHomeFragment); + list.add(stuClassListFragment); + } + UserInfoFragment teaInfoFragment = UserInfoFragment.newInstance("个人信息", MainActivity.this); + list.add(teaInfoFragment); + mainActivityUtil.initPager(list); + } + + /** + * 1、当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法。 + * @param keyCode 自定义标识 + * @param event 用户事件 + * @return 用户是否点击系统返回键 + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(keyCode == KeyEvent.KEYCODE_BACK){ + mainActivityUtil.setExit(); + return false; + } + return super.onKeyDown(keyCode, event); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/MapActivity.java b/app/src/main/java/com/example/stlink/activitys/MapActivity.java new file mode 100644 index 0000000..4772286 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/MapActivity.java @@ -0,0 +1,317 @@ +package com.example.stlink.activitys; + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.View; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.Toast; +import android.widget.ZoomControls; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatButton; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.baidu.location.BDLocation; +import com.baidu.location.LocationClient; +import com.baidu.location.LocationClientOption; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.BitmapDescriptorFactory; +import com.baidu.mapapi.map.MapStatus; +import com.baidu.mapapi.map.MapStatusUpdate; +import com.baidu.mapapi.map.MapStatusUpdateFactory; +import com.baidu.mapapi.map.MapView; +import com.baidu.mapapi.model.LatLng; +import com.baidu.mapapi.search.core.PoiInfo; +import com.baidu.mapapi.search.core.SearchResult; +import com.baidu.mapapi.search.geocode.GeoCodeResult; +import com.baidu.mapapi.search.geocode.GeoCoder; +import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; +import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption; +import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; +import com.example.stlink.R; +import com.example.stlink.configs.adapter.LocationPoiAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.fragments.StuHomeFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.utils.MyLocationListener; + +import java.util.ArrayList; +import java.util.List; + +public class MapActivity extends AppCompatActivity { + private MapView mMapView = null; + private BaiduMap mBaiduMap = null; + private LocationClient mLocationClient = null; + BitmapDescriptor bitmap = null; + + private ImageView ivRelocation; + private ImageButton abBtReturn; + private AppCompatButton abBtSave; + + private MyLocationListener myLocationListener; + private BDLocation nowLocation; + + private RecyclerView mRecyclerView; + private LocationPoiAdapter adapter; + private List mList; + + private Handler myLocationListenerHandler; + private Handler locationPoiHandler; + + private onRecyclerViewItemClickListener recyclerViewItemClickListener; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + LocationClient.setAgreePrivacy(true); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_map); + + initView(); + } + + + @Override + protected void onResume() { + mMapView.onResume(); + super.onResume(); + } + + @Override + protected void onPause() { + mMapView.onPause(); + super.onPause(); + } + + @Override + protected void onDestroy() { + mLocationClient.stop(); + mBaiduMap.setMyLocationEnabled(false); + MyLocationListener.isFirstLocate = true; + mMapView.onDestroy(); + mMapView = null; + super.onDestroy(); + } + + /** + * 初始化地图相关 + */ + private void initView(){ + //获取布局相关控件 + mMapView = findViewById(R.id.b_map_view); + ivRelocation = findViewById(R.id.iv_relocation); + abBtReturn = findViewById(R.id.ab_bt_return); + abBtSave = findViewById(R.id.ab_bt_save); + bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.location); + + mRecyclerView= findViewById(R.id.rv_msg); + mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + locationPoiHandler = new Handler(new Handler.Callback() { + @SuppressLint("NotifyDataSetChanged") + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 1){ + adapter=new LocationPoiAdapter(MapActivity.this,mList); + mRecyclerView.setAdapter(adapter); + adapter.notifyDataSetChanged(); + adapter.setOnItemClickListener(recyclerViewItemClickListener); + } + return false; + } + }); + + myLocationListenerHandler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + nowLocation = myLocationListener.getLocation(); + if(msg.arg1 == 200 && nowLocation != null){ + LatLng point = new LatLng(nowLocation.getLatitude(), nowLocation.getLongitude()); + System.out.println("reverseGeocoding: start!!!!!!!!!!!!"); + //单次定位结束,销毁定位 + System.out.println("mBaiduMap:closing................"); + mLocationClient.stop(); + //关闭定位图层 +// mBaiduMap.setMyLocationEnabled(false); + //开始地理反编码 + reverseGeocoding(point); + }else{ + System.out.println("mLocationClient : " + mLocationClient.toString()); + System.out.println("nowLocation : " + nowLocation); + } + return false; + } + }); + + // 得到地图 + mBaiduMap = mMapView.getMap(); + // 开启定位图层 + mBaiduMap.setMyLocationEnabled(true); + //设置默认放大倍数 + mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(20).build())); + mMapView.getMap().setMaxAndMinZoomLevel(21, 19); + //定位初始化 + try { + mLocationClient = new LocationClient(MapActivity.this); + } catch (Exception e) { + e.printStackTrace(); + } + + // 隐藏logo + View child = mMapView.getChildAt(1); + if ((child instanceof ImageView || child instanceof ZoomControls)){ + child.setVisibility(View.INVISIBLE); + } + //隐藏放大缩小控件 + mMapView.showZoomControls(false); + + //通过LocationClientOption设置LocationClient相关参数 + LocationClientOption locationClientOption = new LocationClientOption(); + // 可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度 + locationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); + locationClientOption.setOpenGps(true); // 打开gps + locationClientOption.setCoorType("bd09ll"); // 设置坐标类型 + locationClientOption.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 + // 可选,设置地址信息 + locationClientOption.setIsNeedAddress(true); + locationClientOption.setIsEnableBeidouMode(true); + //可选,设置是否需要地址描述 + locationClientOption.setIsNeedLocationDescribe(true); + //设置locationClientOption + mLocationClient.setLocOption(locationClientOption); + + //注册LocationListener监听器, 获取本地定位 + myLocationListener = new MyLocationListener(mMapView, mBaiduMap, myLocationListenerHandler); + mLocationClient.registerLocationListener(myLocationListener); + //开启地图定位图层 + mLocationClient.start(); + + //设置其他监听事件 + setOtherListener(); + } + + + /** + * 地理反编码 + * @param point 经纬度 + */ + private void reverseGeocoding(LatLng point){ + //实例化一个地理编码查询对象 + GeoCoder geoCoder = GeoCoder.newInstance(); + //设置反地理编码位置坐标 + ReverseGeoCodeOption op = new ReverseGeoCodeOption(); + op.location(point); + op.pageSize(1); + //发起反地理编码请求(经纬度->地址信息) + geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { + @Override + public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) { + if (geoCodeResult == null + || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) { + Toast.makeText(getApplicationContext(), "没有检测到结果", Toast.LENGTH_SHORT).show(); + } + } + @SuppressLint("NotifyDataSetChanged") + @Override + public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { + if (reverseGeoCodeResult == null + || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) { + Toast.makeText(getApplicationContext(), "没有检测到结果", Toast.LENGTH_SHORT).show(); + } else { + System.out.println("reverseGeocoding: success!!!!!!!!!!!!"); + reverseGeoCodeResult.getPoiList(); + mList = (ArrayList) reverseGeoCodeResult.getPoiList(); + System.out.println("mList : " + mList); + Message message = new Message(); + message.arg1 = 1; + //发送消息,将反编码结果刷新到布局上 + locationPoiHandler.sendMessage(message); + } + } + }); + geoCoder.reverseGeoCode(op); + // 释放实例 + geoCoder.destroy(); + } + + /** + * 设置点击事件监听 + */ + private void setOtherListener(){ + //重定位 + ivRelocation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //点击重定位按钮,启动定位 + System.out.println("mBaiduMap:starting................"); + mLocationClient.start(); + //开启定位图层 +// mBaiduMap.setMyLocationEnabled(true); +// BDLocation nowLocation = myLocationListener.getLocation(); +// LatLng ll = new LatLng(nowLocation.getLatitude(), nowLocation.getLongitude()); +// MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll); +// mBaiduMap.animateMapStatus(msu); + } + }); + abBtReturn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + //保存 + abBtSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + nowLocation = myLocationListener.getLocation(); + String ll = "(" + nowLocation.getLatitude() + "," + nowLocation.getLongitude() + ")"; + Intent intent = new Intent(); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.LOCATION, ll); + intent.putExtras(bundle); + setResult(100,intent); + finish(); + } + }); + recyclerViewItemClickListener = new onRecyclerViewItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + PoiInfo poiInfo = mList.get(position); + AlertDialog alertDialog2 = new AlertDialog.Builder(MapActivity.this) + .setMessage("签到地点【" + poiInfo.name + "】") + .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Intent intent = new Intent(); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.LOCATION, poiInfo.name); + intent.putExtras(bundle); + setResult(100,intent); + finish(); + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + } + }) + .create(); + alertDialog2.show(); + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { } + }; + + } +} + diff --git a/app/src/main/java/com/example/stlink/activitys/RegisterActivity.java b/app/src/main/java/com/example/stlink/activitys/RegisterActivity.java new file mode 100644 index 0000000..3dbcdd6 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/RegisterActivity.java @@ -0,0 +1,81 @@ +package com.example.stlink.activitys; + +import android.os.Bundle; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.activityUtil.RegisterUtil; + +/** + * 学生端注册 + */ +public class RegisterActivity extends AppCompatActivity { + + private TextView tvRgTitle; + private ImageView ivRgUserImg; + private EditText teaAccount; + private EditText teaPwdFirst; + private EditText teaPwdSecond; + private Button btRegister; + + private Integer roleId; + private Bundle bundle; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register); + + initView(); + } + + /** + * 初始化布局 + */ + private void initView(){ + //修改状态栏字体颜色 + CommonUtils.changeStatusBar(this); + + teaAccount = findViewById(R.id.id_rg); + teaPwdFirst = findViewById(R.id.pwd_rg_first); + teaPwdSecond = findViewById(R.id.pwd_rg_second); + + tvRgTitle = findViewById(R.id.tv_rg_title); + ivRgUserImg = findViewById(R.id.rg_user_title_img); + + bundle = getIntent().getExtras(); + roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID); + + if(roleId == 1){ + tvRgTitle.setText("教师端注册"); + ivRgUserImg.setImageResource(R.mipmap.teacher); + } + + + btRegister = findViewById(R.id.bt_register); + + setOnClickListener(); + } + + /** + * 为按钮添加点击监听事件 + */ + private void setOnClickListener(){ + //为注册按钮添加点击监听事件 + RegisterUtil.userRegister( + RegisterActivity.this, + btRegister, + teaAccount, + teaPwdFirst, + teaPwdSecond + ); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/ScanQRCodeActivity.java b/app/src/main/java/com/example/stlink/activitys/ScanQRCodeActivity.java new file mode 100644 index 0000000..57bc99b --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/ScanQRCodeActivity.java @@ -0,0 +1,22 @@ +package com.example.stlink.activitys; + + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; + +public class ScanQRCodeActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_scan_code); + } + + private void initView(){ + + } + +} + diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuClassList/CourseSignIn.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuClassList/CourseSignIn.java new file mode 100644 index 0000000..0e4af34 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuClassList/CourseSignIn.java @@ -0,0 +1,343 @@ +package com.example.stlink.activitys.fragmentChild.activityStuClassList; + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.Editable; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.fastjson.JSON; +import com.example.stlink.R; +import com.example.stlink.activitys.ScanQRCodeActivity; +import com.example.stlink.configs.adapter.StuCourseSignedAdapter; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.CourseSign; +import com.example.stlink.model.request.StuSignRequest; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; +import com.google.android.material.textfield.TextInputEditText; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; + +import java.util.ArrayList; +import java.util.List; + +public class CourseSignIn extends AppCompatActivity { + + private ImageView abIvTitle; + private TextView tvCreateTimeMsg; + private TextView tvSignAddressMsg; + private TextView tvCourseName; + private Button btSign; + private TextView tvSignRecord; + private RecyclerView rvStuCourseList; + + private TextInputEditText etCodeInput; + + private static List courseHasSignedList; + private static StuCourseSignedAdapter adapter; + + private Handler signHandler; + private Handler getSignedHandler; + private Bundle bundle; + + private String signCodeStr; + private long courseSignId; + private long courseId; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_stu_course_sign_in); + + initView(); + } + + private void initView(){ + CommonUtils.changeStatusBar(CourseSignIn.this); + + abIvTitle = findViewById(R.id.ab_iv_title); + tvCreateTimeMsg = findViewById(R.id.tv_create_time_msg); + tvSignAddressMsg = findViewById(R.id.tv_sign_address_msg); + tvCourseName = findViewById(R.id.tv_course_name); + btSign = findViewById(R.id.bt_sign); + tvSignRecord = findViewById(R.id.tv_sign_record); + rvStuCourseList = findViewById(R.id.rv_stu_course_list); + + setClickListener(); + + refreshData(); + } + + + private void refreshData(){ + bundle = getIntent().getExtras(); + + CourseSign courseSign = (CourseSign) bundle.getSerializable(ModelFieldConstants.COURSE_SIGN); + System.out.println("CourseSignIn:courseSign = " + courseSign); + String courseName = courseSign.getCourseName(); + String courseAddr = courseSign.getCourseAddr(); + long courseCreateTimeStamp = courseSign.getCreateTime(); + courseSignId = courseSign.getUserSignId(); + courseId = courseSign.getCourseId(); + + tvCreateTimeMsg.setText(CommonUtils.stampToDate(String.valueOf(courseCreateTimeStamp), "yyyy-MM-dd hh:mm:ss")); + tvSignAddressMsg.setText(courseAddr); + tvCourseName.setText(courseName); + + courseHasSignedList = new ArrayList<>(); + adapter = new StuCourseSignedAdapter( + CourseSignIn.this, + R.layout.item_stu_signed, + courseHasSignedList, + 0 + ); + LinearLayoutManager llm = new LinearLayoutManager(CourseSignIn.this); + rvStuCourseList.setLayoutManager(llm); + rvStuCourseList.setAdapter(adapter); + + } + + private void setClickListener(){ + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + //点击签到后的事件 + btSign.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + @SuppressLint("InflateParams") + View view = LayoutInflater.from(CourseSignIn.this).inflate(R.layout.dialog_input, null); + AlertDialog.Builder builder = new AlertDialog.Builder(CourseSignIn.this) + .setMessage("请输入签到口令") + .setView(view) + .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + etCodeInput = view.findViewById(R.id.et_code_input); + Editable etSignCode = etCodeInput.getText(); + if(etSignCode == null){ + Toast.makeText(CourseSignIn.this, "口令为空", Toast.LENGTH_SHORT).show(); + }else{ + signCodeStr = etSignCode.toString(); + int signCode; + StuSignRequest stuSignRequest = new StuSignRequest(); + stuSignRequest.setUserSignId(courseSignId); + stuSignRequest.setUserId(bundle.getLong(ModelFieldConstants.ID)); + try{ + signCode = Integer.parseInt(signCodeStr); + stuSignRequest.setSignCode(signCode); + signHandler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == -1){ + String errorMsg = (String) msg.obj; + Toast.makeText(CourseSignIn.this, errorMsg, Toast.LENGTH_SHORT).show(); + }else if(msg.arg1 == 1){ + Toast.makeText(CourseSignIn.this, "签到成功", Toast.LENGTH_SHORT).show(); + tvSignRecord.setVisibility(View.VISIBLE); + getSignedHandler = new Handler(new Handler.Callback() { + @SuppressLint("NotifyDataSetChanged") + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 1){ + adapter.notifyDataSetChanged(); + } + return false; + } + }); + getHasSignedList(); + } + return false; + } + }); + signIn(stuSignRequest); + }catch ( NumberFormatException numberFormatException){ + Toast.makeText(CourseSignIn.this, "口令输入错误", Toast.LENGTH_SHORT).show(); + } + } + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + } + }) + .setNeutralButton("扫码", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // TODO 扫码签到 +// Intent intent = new Intent(CourseSignIn.this, ScanQRCodeActivity.class); +// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); +// startActivity(intent); + // 创建IntentIntegrator对象 + IntentIntegrator intentIntegrator = new IntentIntegrator(CourseSignIn.this) + .setBeepEnabled(true) //扫描提示音 + .setPrompt("这是个扫码签到界面") + //.setCaptureActivity(MyCaptureActivity.class) //修改扫码活动 + .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)// 扫码的类型,可选:一维码,二维码,一/二维码 + .setTimeout(10000);//15秒未扫描,则将自动关闭扫码界面 + // 开始扫描 + intentIntegrator.initiateScan(); + } + }); + AlertDialog alertDialog2 = builder.create(); + alertDialog2.show(); + } + }); + } + + /** + * 获取已选课程待签到内容 + */ + private void getHasSignedList(){ + new Thread(new Runnable() { + @Override + public void run() { + bundle = getIntent().getExtras(); + String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID) + "&" + + ModelFieldConstants.COURSE_SIGN_STATUS + "=" + 1 + "&" + + "current=1&size=10"; + String url = UrlConstants.STUDENT_SIGN_LIST + "?" + urlParam; + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + if(baseResponse.getData() != null){ + System.out.println("StuClassListFragment:courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + //array:学生获取所选课程签到列表返回实体 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + if(courseData.getRecords().size() != 0){ + courseHasSignedList.addAll(courseData.getRecords()); + System.out.println("Here............................."); + Message message = new Message(); + message.arg1 = 1; + getSignedHandler.sendMessage(message); + } + } + } + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + }).start(); + } + + /** + * 学生签到 + * @param stuSignRequest 封装好的学生签到请求 + */ + private void signIn(StuSignRequest stuSignRequest){ + new Thread(new Runnable() { + @Override + public void run() { + System.out.println( "CourseSignIn:stuSignRequest : " + stuSignRequest.toString()); + String json = JSON.toJSONString(stuSignRequest); + String url = UrlConstants.STUDENT_SIGN; + + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.arg1 = 1; + signHandler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.arg1 = -1; + message.obj = baseResponse.getMsg(); + signHandler.sendMessage(message); + } + }.postConnect(url, json); + } + }).start(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // 获取解析结果 + IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); + if (result != null) { + if (result.getContents() == null) { + Toast.makeText(this, "取消扫描", Toast.LENGTH_LONG).show(); + } else { + String signCodeStr = result.getContents(); + int signCode; + StuSignRequest stuSignRequest = new StuSignRequest(); + stuSignRequest.setUserSignId(courseSignId); + stuSignRequest.setUserId(bundle.getLong(ModelFieldConstants.ID)); + try{ + signCode = Integer.parseInt(signCodeStr); + stuSignRequest.setSignCode(signCode); + signHandler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == -1){ + String errorMsg = (String) msg.obj; + Toast.makeText(CourseSignIn.this, errorMsg, Toast.LENGTH_SHORT).show(); + }else if(msg.arg1 == 1){ + Toast.makeText(CourseSignIn.this, "签到成功", Toast.LENGTH_SHORT).show(); + tvSignRecord.setVisibility(View.VISIBLE); + getSignedHandler = new Handler(new Handler.Callback() { + @SuppressLint("NotifyDataSetChanged") + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 1){ + adapter.notifyDataSetChanged(); + } + return false; + } + }); + getHasSignedList(); + } + return false; + } + }); + signIn(stuSignRequest); + }catch ( NumberFormatException numberFormatException){ + Toast.makeText(CourseSignIn.this, "口令输入错误", Toast.LENGTH_SHORT).show(); + } + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuHome/AllCourses.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuHome/AllCourses.java new file mode 100644 index 0000000..7d917ba --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityStuHome/AllCourses.java @@ -0,0 +1,177 @@ +package com.example.stlink.activitys.fragmentChild.activityStuHome; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.StuAddCourseAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +public class AllCourses extends AppCompatActivity { + + private RecyclerView lvAllCourse; + private List coursesData; + private StuAddCourseAdapter adapter; + private ImageView abIvTitle; + private static SwipeRefreshLayout srlMyRefresh; + + private static Bundle bundle; + private static Handler handler; + + private int page = 1; + + private int mCurrentColIndex = 0; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_all_course); + initView(); + refreshData(); + } + + + /** + * 初始化布局中相关事件 + */ + private void initView(){ + lvAllCourse = findViewById(R.id.lv_all_course_list); + abIvTitle = findViewById(R.id.ab_iv_title); + srlMyRefresh = findViewById(R.id.srl_my_refresh); + srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00")); + + } + + + /** + * 刷新数据 + */ + public void refreshData(){ + + coursesData = new ArrayList<>(); + adapter = new StuAddCourseAdapter( + AllCourses.this, + R.layout.card_course_stu, + coursesData, + 0 + ); + LinearLayoutManager llm = new LinearLayoutManager(AllCourses.this); + lvAllCourse.setLayoutManager(llm); + lvAllCourse.setAdapter(adapter); + + bundle = getIntent().getExtras(); + handler = new Handler(Looper.getMainLooper()){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + CourseData courseData = (CourseData) msg.obj; + coursesData.addAll(courseData.getRecords()); + adapter.notifyDataSetChanged(); + System.out.println("size == " + adapter.getItemCount() + "................................"); + } + }; + getAllCourseList(10); + setListener(); + } + + /** + * 添加点击事件 + */ + public void setListener(){ + adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { } + }); + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshData(); + srlMyRefresh.setRefreshing(false); + } + }); + } + + /** + * 用一个子线程进行网络请求 + * 刷新数据 + * @param page 页面 + */ + private void getAllCourseList(final int page){ + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.SIZE + "=" + page + "&" + + ModelFieldConstants.CURRENT + "=" + "1"; + final String url = UrlConstants.ALL_COURSE + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + System.out.println("courseData = " + courseData); + + if(courseData != null){ + Message message = new Message(); + message.obj = courseData; + handler.sendMessage(message); + }else{ + System.out.println("courseData: null " + "..............................."); + } + } + + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + }).start(); + } + +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaCourse/CourseDetail.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaCourse/CourseDetail.java new file mode 100644 index 0000000..129d8ae --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaCourse/CourseDetail.java @@ -0,0 +1,191 @@ +package com.example.stlink.activitys.fragmentChild.activityTeaCourse; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.example.stlink.R; +import com.example.stlink.fragments.CourseClassListFragment; +import com.example.stlink.fragments.CourseIntroMsgFragment; +import com.example.stlink.fragments.CourseSelectedStuFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseDetailData; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.activityUtil.CourseDetailUtil; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +public class CourseDetail extends AppCompatActivity { + + private ImageView abIvTitle; + private TextView abTvCourseName; + private TextView abTvCollegeName; + private TextView abTvTeacherName; + private TextView abTvCourseIdMsg; + + private Integer position; + + CourseDetailUtil courseDetailUtil; + + private Bundle bundle; + private Handler handler; + + private CourseDetailData mCourseDetailData; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_course_detail); + + initView(); + + initPager(); + + } + + private void initView(){ + //修改状态栏字体颜色 + CommonUtils.changeStatusBar(this); + + abIvTitle = findViewById(R.id.ab_iv_title); + abTvTeacherName = findViewById(R.id.ab_tv_teacher_name); + abTvCollegeName = findViewById(R.id.ab_tv_college_name); + abTvCourseName = findViewById(R.id.ab_tv_course_name); + abTvCourseIdMsg = findViewById(R.id.ab_tv_course_id_msg); + + courseDetailUtil = new CourseDetailUtil(this); + courseDetailUtil.initView(); + + setListener(); + + refreshData(); + + } + + private void refreshData(){ + bundle = getIntent().getExtras(); + + handler = new Handler(Looper.getMainLooper()){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if(msg.arg1 == 200){ + CourseDetailData courseDetailData = (CourseDetailData) msg.obj; + mCourseDetailData = courseDetailData; + String courseName = courseDetailData.getCourseName(); + String collegeName = courseDetailData.getCollegeName(); + String teacherName = courseDetailData.getRealName(); + Long idMsg = courseDetailData.getId(); + if(teacherName != null){ + abTvTeacherName.setText(teacherName); + } + if(collegeName != null){ + abTvCollegeName.setText(collegeName); + } + if(courseName != null){ + abTvCourseName.setText(courseName); + } + if(idMsg != null){ + abTvCourseIdMsg.setText(String.valueOf(idMsg)); + } + bundle = getIntent().getExtras(); + bundle.putSerializable(ModelFieldConstants.COURSE_DETAIL_DATA, mCourseDetailData); + getIntent().putExtras(bundle); + //在网路请求成功后,回调进行加载数据 + CourseIntroMsgFragment.freshData(getIntent()); + }else{ + System.out.println("msg = " + msg.obj.toString()); + } + } + }; + getCourseDetail(); + } + + /** + * 设置返回键点击事件 + */ + private void setListener(){ + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + finish(); + } + }); + } + + private void initPager(){ + List list = new ArrayList<>(); + CourseIntroMsgFragment courseIntroMsgFragment = CourseIntroMsgFragment.newInstance("课程简介", CourseDetail.this); + CourseClassListFragment courseClassListFragment = CourseClassListFragment.newInstance("班级列表", CourseDetail.this); + CourseSelectedStuFragment courseSelectedStuFragment = CourseSelectedStuFragment.newInstance("选课学生", CourseDetail.this); + list.add(courseIntroMsgFragment); + list.add(courseClassListFragment); + list.add(courseSelectedStuFragment); + courseDetailUtil.initPage(list); + } + + private void getCourseDetail(){ + new Thread(new Runnable() { + @Override + public void run() { + + long courseId = bundle.getLong(ModelFieldConstants.COURSE_ID); + long userId = bundle.getLong(ModelFieldConstants.USER_ID); + + String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + userId; + String url = UrlConstants.COURSE_DETAIL + "?" + urlParam; + + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDetailMap = null; + if(obj instanceof LinkedTreeMap){ + courseDetailMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到User类中 + String jsonString = gson.toJson(courseDetailMap); + CourseDetailData courseDetail = gson.fromJson(jsonString, new TypeToken() {}.getType()); + System.out.println("courseDetail = " + courseDetail + ".................."); + Message message = new Message(); + message.obj = courseDetail; + message.arg1 = 200; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = baseResponse.getMsg(); + message.arg1 = baseResponse.getCode(); + handler .sendMessage(message); + } + }.getConnect(url); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CheckCourseSign.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CheckCourseSign.java new file mode 100644 index 0000000..9863289 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CheckCourseSign.java @@ -0,0 +1,170 @@ +package com.example.stlink.activitys.fragmentChild.activityTeaHome; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.example.stlink.R; +import com.example.stlink.fragments.DidNotSignListFragment; +import com.example.stlink.fragments.LeaveListFragment; +import com.example.stlink.fragments.SignListFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseSignMsg; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.activityUtil.CheckCourseSignUtil; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; + +import java.util.ArrayList; +import java.util.List; + +public class CheckCourseSign extends AppCompatActivity { + + private ImageView abIvTitle; + private TextView aTvCourseName; + private TextView tvCourseNameMsg; + private TextView tvCourseTeaNameMsg; + private TextView tvCourseStuAmountMsg; + private TextView tvCourseStuArriveAmountMsg; + private TextView tvCourseStuLeaveAmountMsg; + + + private CheckCourseSignUtil checkCourseSignUtil; + + private CourseSignMsg courseSignMsg; + + private Bundle bundle; + private Handler handler; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tea_check_course_sign); + initView(); + initPage(); + } + + + private void initView(){ + CommonUtils.changeStatusBar(CheckCourseSign.this); + + abIvTitle = findViewById(R.id.ab_iv_title); + aTvCourseName = findViewById(R.id.ab_tv_course_name); + tvCourseNameMsg = findViewById(R.id.tv_course_name_msg); + tvCourseTeaNameMsg = findViewById(R.id.tv_course_tea_name_msg); + tvCourseStuAmountMsg = findViewById(R.id.tv_course_stu_amount_msg); + tvCourseStuArriveAmountMsg = findViewById(R.id.tv_course_stu_arrive_amount_msg); + tvCourseStuLeaveAmountMsg = findViewById(R.id.tv_course_stu_leave_amount_msg); + + checkCourseSignUtil = new CheckCourseSignUtil(this.getWindow().getDecorView(),CheckCourseSign.this); + + + setClickListener(); + + refreshData(); + + handler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 200){ + aTvCourseName.setText(courseSignMsg.getCourseName()); + tvCourseStuAmountMsg.setText(String.valueOf(courseSignMsg.getCourseNum())); + } + return false; + } + }); + getCourseSignMsg(); + } + + private void refreshData(){ + bundle = getIntent().getExtras(); + String courseName = bundle.getString(ModelFieldConstants.NOW_SIGN_COURSE_NAME); + if(!TextUtils.isEmpty(courseName)){ + aTvCourseName.setText(courseName); + } + String teaName = bundle.getString(ModelFieldConstants.REAL_NAME); + if(!TextUtils.isEmpty(teaName)){ + tvCourseTeaNameMsg.setText(teaName); + } + } + + private void setClickListener(){ + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + /** + * 绑定viewpager2 + */ + private void initPage(){ + List list = new ArrayList<>(); + SignListFragment signListFragment = SignListFragment.newInstance("已签到", this); + DidNotSignListFragment didNotSignListFragment = DidNotSignListFragment.newInstance("未签到", this); + LeaveListFragment leaveListFragment = LeaveListFragment.newInstance("请假列表", this); + list.add(signListFragment); + list.add(didNotSignListFragment); + list.add(leaveListFragment); + checkCourseSignUtil.initPage(list); + } + + /** + * 获取签到页面信息 + */ + private void getCourseSignMsg(){ + bundle = getIntent().getExtras(); + Long courseId = bundle.getLong(ModelFieldConstants.NOW_SIGN_COURSE_ID); + Long userId = bundle.getLong(ModelFieldConstants.ID); + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + userId; + final String url = UrlConstants.TEACHER_PAGE + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + courseSignMsg = new CourseSignMsg(); + String jsonString = gson.toJson(courseDataMap); + courseSignMsg = gson.fromJson(jsonString, CourseSignMsg.class); + + System.out.println("CheckCourseSign:courseData = " + courseSignMsg); + + Message message = new Message(); + message.arg1 = 200; + handler.sendMessage(message); + } + + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/ChooseCourse.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/ChooseCourse.java new file mode 100644 index 0000000..1d3f563 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/ChooseCourse.java @@ -0,0 +1,162 @@ +package com.example.stlink.activitys.fragmentChild.activityTeaHome; + + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.CourseChooseAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +public class ChooseCourse extends AppCompatActivity { + + private ImageView abIvTitle; + private RecyclerView rvCourseList; + + private List coursesData; + private CourseChooseAdapter adapter; + private static Handler handler; + private static Bundle bundle; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choose_course); + + initView(); + } + + private void initView(){ + abIvTitle = findViewById(R.id.ab_iv_title); + rvCourseList = findViewById(R.id.rv_course_list); + + coursesData = new ArrayList<>(); + adapter = new CourseChooseAdapter( + ChooseCourse.this, + R.layout.card_course_name_list, + coursesData + ); + LinearLayoutManager llm = new LinearLayoutManager(ChooseCourse.this); + rvCourseList.setLayoutManager(llm); + rvCourseList.setAdapter(adapter); + + bundle = getIntent().getExtras(); + handler = new Handler(Looper.getMainLooper()){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + CourseData courseData = (CourseData) msg.obj; + coursesData.addAll(courseData.getRecords()); + adapter.notifyDataSetChanged(); + System.out.println("size == " + adapter.getItemCount() + "................................"); + } + }; + getUnfinishedCourseList(); + + initPage(); + } + + private void initPage(){ + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + bundle = getIntent().getExtras(); + int chooseCourseSelect = bundle.getInt(ModelFieldConstants.COURSE_CHOOSE_SELECT); + Course course = coursesData.get(position); + String courseName = course.getmCourseName(); + Long courseId = course.getmCourseId(); + bundle.putString(ModelFieldConstants.COURSE_NAME, courseName); + bundle.putLong(ModelFieldConstants.COURSE_ID, courseId); + if(chooseCourseSelect == 0){ + Intent intent = new Intent(); + intent.putExtras(bundle); + setResult(200,intent); + finish(); + }else if (chooseCourseSelect == 1){ + bundle.putLong(ModelFieldConstants.NOW_SIGN_COURSE_ID, courseId); + bundle.putString(ModelFieldConstants.NOW_SIGN_COURSE_NAME, courseName); + Intent intent = new Intent(ChooseCourse.this, CheckCourseSign.class); + intent.putExtras(bundle); + startActivity(intent); + } + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { } + }); + } + + private static void getUnfinishedCourseList(){ + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID); + final String url = UrlConstants.TEACHER_UNFINISHED + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + System.out.println("courseData = " + courseData); + + if(courseData != null){ + Message message = new Message(); + message.obj = courseData; + handler.sendMessage(message); + }else{ + System.out.println("courseData: null " + "..............................."); + } + } + @Override + public void failedMethod(BaseResponse baseResponse) { + + } + }.getConnect(url); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CreateCourse.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CreateCourse.java new file mode 100644 index 0000000..b39f988 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CreateCourse.java @@ -0,0 +1,370 @@ +package com.example.stlink.activitys.fragmentChild.activityTeaHome; + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.bumptech.glide.Glide; +import com.donkingliang.imageselector.utils.ImageSelector; +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.request.CourseCreateRequest; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.activityUtil.CreateCourseUtil; +import com.example.stlink.utils.activityUtil.ImgUploadUtil; +import com.google.android.material.datepicker.MaterialDatePicker; +import com.google.android.material.datepicker.MaterialPickerOnPositiveButtonClickListener; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import com.google.android.material.textfield.TextInputEditText; + +import java.util.ArrayList; +import java.util.Objects; + +public class CreateCourse extends AppCompatActivity { + + private ImageView abIvTitle; + private TextInputEditText etCourseName; + private ImageView ivAddImg; + private TextInputEditText etCourseDescription; + private TextInputEditText etStartTime; + private TextInputEditText etEndTime; + private TextInputEditText etCreateTime; + private TextInputEditText etStatus; + private Button btCreateCourse; + + private boolean isSuccessCoursePhoto; + private boolean isSuccessCourseStartTime; + private boolean isSuccessCourseEndTime; + private boolean isSuccessCourseCreateTime; + + private MaterialDatePicker startDatePicker; + private MaterialDatePicker endDatePicker; + private Bundle bundle; + + private Handler btAddHandler; + + //每两秒进行一个检测 + private final Runnable btRunnable = new Runnable() { + @SuppressLint("ResourceAsColor") + @Override + public void run() { + //如果所有信息都已经添加成功之后,才启用按钮,= + if(isSuccessCoursePhoto && isSuccessCourseStartTime && isSuccessCourseEndTime && isSuccessCourseCreateTime){ + System.out.println("Here...............................1"); + String courseName = Objects.requireNonNull(etCourseName.getText()).toString(); + String courseIntroduce = Objects.requireNonNull(etCourseDescription.getText()).toString(); + Bundle bundle1 = getIntent().getExtras(); + bundle1.putString(ModelFieldConstants.COURSE_NAME, courseName); + bundle1.putString(ModelFieldConstants.INTRODUCE, courseIntroduce); + getIntent().putExtras(bundle1); + //课程名和课程简介不能为空 + if(!TextUtils.isEmpty(courseName) && !TextUtils.isEmpty(courseIntroduce)){ + System.out.println("Here...............................2"); + Bundle bundle2 = getIntent().getExtras(); + long startTime = bundle2.getLong(ModelFieldConstants.START_TIME); + long endTime = bundle2.getLong(ModelFieldConstants.END_TIME); + System.out.println("startTime == " + startTime + ".........................."); + System.out.println("endTime == " + endTime + "..........................."); + //结束时间要在开始时间之后 + String courseStatus = Objects.requireNonNull(etStatus.getText()).toString(); + boolean isFinished = "已结课".equals(courseStatus); + if((!isFinished && (startTime < endTime)) || (isFinished && (startTime >= endTime))){ + System.out.println("Here...............................3"); + //启用按钮 + btCreateCourse.setEnabled(true); + //更改按钮样式 + btCreateCourse.setBackgroundResource(R.drawable.selector_bottom_add_course); + btCreateCourse.setTextColor(Color.WHITE); + //按钮事件 + btCreateCourse.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + System.out.println("createCourse............."); + Handler handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if ("success".equals(msg.obj)){ + System.out.println("添加成功..........."); + Toast.makeText(CreateCourse.this, "创建成功", Toast.LENGTH_SHORT).show(); + btAddHandler.removeCallbacks(btRunnable); + finish(); + } + } + }; + CreateCourseUtil.createCourse(CreateCourse.this, getCourseRequest(), handler, UrlConstants.TEACHER_COURSE); + } + }); + }else { + //禁用按钮 + btCreateCourse.setEnabled(false); + } + }else { + //禁用按钮 + btCreateCourse.setEnabled(false); + } + }else{ + //禁用按钮 + btCreateCourse.setEnabled(false); + } + btAddHandler.postDelayed(this, 2000); + } + }; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tea_create_course); + + initView(); + + btAddHandler.postDelayed(btRunnable, 2000); + } + + + //用于图片选择器选择图片之后的回调,来完成图片上传和刷新本地 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 100 && data != null) { + //获取选择器返回的数据 + ArrayList images = data.getStringArrayListExtra( + ImageSelector.SELECT_RESULT); + String url = images.get(0); + Handler handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + bundle = (Bundle) msg.obj; + if(bundle.getBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS)){ + System.out.println("refreshData.................."); + getIntent().putExtras(bundle); + refreshData(); + //表示照片添加成功 + isSuccessCoursePhoto = true; + }else{ + Toast.makeText(CreateCourse.this, "修改失败", Toast.LENGTH_SHORT).show(); + } + } + }; + ImgUploadUtil.userImgUpload(bundle, handler, url, ModelFieldConstants.COURSE_PHOTO); + /** + * 是否是来自于相机拍照的图片, + * 只有本次调用相机拍出来的照片,返回时才为true。 + * 当为true时,图片返回的结果有且只有一张图片。 + */ + boolean isCameraImage = data.getBooleanExtra(ImageSelector.IS_CAMERA_IMAGE, false); + } + } + + /** + * 初始化活动 + */ + private void initView(){ + CommonUtils.changeStatusBar(this); + + btAddHandler = new Handler(); + + isSuccessCoursePhoto = false; + isSuccessCourseStartTime = false; + isSuccessCourseEndTime = false; + isSuccessCourseCreateTime = false; + + abIvTitle = findViewById(R.id.ab_iv_title); + etCourseName = findViewById(R.id.et_course_name); + ivAddImg = findViewById(R.id.iv_add_img); + etCourseDescription = findViewById(R.id.et_course_description); + etStartTime = findViewById(R.id.et_start_time); + etEndTime = findViewById(R.id.et_end_time); + etCreateTime = findViewById(R.id.et_create_time); + etStatus = findViewById(R.id.et_status); + btCreateCourse = findViewById(R.id.bt_create_course); + + startDatePicker = MaterialDatePicker.Builder.datePicker() + .setTitleText("SELECT DATE") + .setSelection(MaterialDatePicker.todayInUtcMilliseconds()) + .build(); + endDatePicker = MaterialDatePicker.Builder.datePicker() + .setTitleText("SELECT DATE") + .setSelection(MaterialDatePicker.todayInUtcMilliseconds()) + .build(); + + btCreateCourse.setEnabled(false); + + refreshData(); + + setClickListener(); + } + + private void refreshData(){ + + bundle = getIntent().getExtras(); + String courseImg = bundle.getString(ModelFieldConstants.COURSE_PHOTO); + if(courseImg != null){ + Glide.with(getApplicationContext()) + .load(courseImg) + .into(ivAddImg); + } + + //不可粘贴,长按不会弹出粘贴框 + etStartTime.setKeyListener(null); + etEndTime.setKeyListener(null); + etCreateTime.setKeyListener(null); + etStatus.setKeyListener(null); + } + + /** + * 添加点击事件 + */ + private void setClickListener(){ + startDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener() { + @Override + public void onPositiveButtonClick(Long selection) { + String startFormDate = CommonUtils.stampToDate(String.valueOf(selection), "yyyy年MM月dd日"); + etStartTime.setText(startFormDate); + isSuccessCourseStartTime = true; + Bundle bundle1 = getIntent().getExtras(); + bundle1.putLong(ModelFieldConstants.START_TIME, selection); + getIntent().putExtras(bundle1); + } + }); + endDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener() { + @Override + public void onPositiveButtonClick(Long selection) { + String endFormDate = CommonUtils.stampToDate(String.valueOf(selection), "yyyy年MM月dd日"); + etEndTime.setText(endFormDate); + isSuccessCourseEndTime = true; + Bundle bundle1 = getIntent().getExtras(); + bundle1.putLong(ModelFieldConstants.END_TIME, selection); + getIntent().putExtras(bundle1); + } + }); + //点击添加图片 + ivAddImg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //调用第三方开源库,单选并剪裁 + ImageSelector.builder() + .useCamera(false) // 设置是否使用拍照 + .setCrop(true) // 设置是否使用图片剪切功能。 + .setCropRatio(1.0f) // 图片剪切的宽高比,默认1.0f。宽固定为手机屏幕的宽。 + .setSingle(true) //设置是否单选 + .canPreview(true) //是否可以预览图片,默认为true + .start(CreateCourse.this, 100); // 打开相册 + } + }); + //课程开始时间 + etStartTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!startDatePicker.isAdded()){ + startDatePicker.show(getSupportFragmentManager(), "Hello"); + } + } + }); + //课程结束时间 + etEndTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!endDatePicker.isAdded()){ + endDatePicker.show(getSupportFragmentManager(), "Hello"); + } + + } + }); + //刷新当前时间 + etCreateTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + long currentDate = System.currentTimeMillis(); + String curFormDate = CommonUtils.stampToDate(String.valueOf(currentDate), "yyyy年MM月dd日"); + etCreateTime.setText(curFormDate); + isSuccessCourseCreateTime = true; + } + }); + //课程状态选择 + etStatus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String[] singleItems = {"未结课", "已结课"}; + int checkedItem = "未结课".equals(etStatus.getText().toString()) ? 0 : 1; + + MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(CreateCourse.this) + .setTitle("请选择课程授课状态") + .setNeutralButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }) + .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + etStatus.setText(singleItems[bundle.getInt("checkedItem")]); + } + }) + .setSingleChoiceItems(singleItems, checkedItem, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + bundle.putInt("checkedItem", which); + } + }); + materialAlertDialogBuilder.show(); + } + }); + + //返回上一个活动 + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + /** + * 获取courseRequest请求实例类 + * @return 返回courseRequest封装好后的实例 + */ + private CourseCreateRequest getCourseRequest(){ + CourseCreateRequest courseCreateRequest = new CourseCreateRequest(); + bundle = getIntent().getExtras(); + String collegeName = bundle.getString(ModelFieldConstants.COLLEGE_NAME); + String courseName = bundle.getString(ModelFieldConstants.COURSE_NAME); + String coursePhoto = bundle.getString(ModelFieldConstants.COURSE_PHOTO); + Long endTime = bundle.getLong(ModelFieldConstants.END_TIME); + String introduce = bundle.getString(ModelFieldConstants.INTRODUCE); + String realName = bundle.getString(ModelFieldConstants.REAL_NAME); + Long startTime = bundle.getLong(ModelFieldConstants.START_TIME); + Long userId = bundle.getLong(ModelFieldConstants.ID); + String username = bundle.getString(ModelFieldConstants.USER_NAME); + + courseCreateRequest.setCollegeName(collegeName); + courseCreateRequest.setCourseName(courseName); + courseCreateRequest.setCoursePhoto(coursePhoto); + courseCreateRequest.setEndTime(endTime); + courseCreateRequest.setIntroduce(introduce); + courseCreateRequest.setRealName(realName); + courseCreateRequest.setStartTime(startTime); + courseCreateRequest.setUserId(userId); + courseCreateRequest.setUserName(username); + + return courseCreateRequest; + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CreateSign.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CreateSign.java new file mode 100644 index 0000000..a0855bb --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityTeaHome/CreateSign.java @@ -0,0 +1,368 @@ +package com.example.stlink.activitys.fragmentChild.activityTeaHome; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatButton; + +import com.alibaba.fastjson.JSON; +import com.example.stlink.R; +import com.example.stlink.activitys.MapActivity; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.request.CourseCreateSignRequest; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.QRCodeUtil; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; +import com.google.android.material.textfield.TextInputEditText; +import com.google.android.material.timepicker.MaterialTimePicker; +import com.google.android.material.timepicker.TimeFormat; + +import java.text.ParseException; +import java.util.Objects; + +public class CreateSign extends AppCompatActivity { + + private ImageView abIvTitle; + private TextView tvCourseName; + private TextInputEditText etStuAmount; + private TextInputEditText etStartTime; + private TextInputEditText etEndTime; + private TextInputEditText etLocation; + private TextInputEditText etCode; + private ImageView ivAddImg; + private AppCompatButton abBtSave; + + private int currYear; + private int currMonth; + private int currDay; + private int currHour; + private int currMin; + private int currSecond; + + private Long startTimeStamp; + private Long endTimeStamp; + private String courseName; + + private boolean hasChooseStartTime; + private boolean hasChooseEndTime; + + private MaterialTimePicker startTimePicker; + private MaterialTimePicker endTimePicker; + private Bundle bundle; + private Handler handler; + + private static ActivityResultLauncher intentActivityResultLauncher; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tea_create_sign); + + initView(); + } + + /** + * 绑定控件 + */ + private void initView(){ + + CommonUtils.changeStatusBar(CreateSign.this); + + hasChooseStartTime = false; + hasChooseEndTime = false; + abIvTitle = findViewById(R.id.ab_iv_title); + tvCourseName = findViewById(R.id.tv_course_name); + etStuAmount = findViewById(R.id.et_stu_amount); + etStartTime = findViewById(R.id.et_start_time); + etEndTime = findViewById(R.id.et_end_time); + etLocation = findViewById(R.id.et_location); + etCode = findViewById(R.id.et_code); + ivAddImg = findViewById(R.id.iv_add_img); + abBtSave = findViewById(R.id.ab_bt_save); + + //禁止输入 + etStartTime.setKeyListener(null); + etEndTime.setKeyListener(null); + etLocation.setKeyListener(null); + + bundle = getIntent().getExtras(); + courseName = bundle.getString(ModelFieldConstants.COURSE_NAME); + if(!TextUtils.isEmpty(courseName)){ + tvCourseName.setText(courseName); + } + + + Long curTimeStamp = System.currentTimeMillis(); + + String currTime = CommonUtils.stampToDate(String.valueOf(curTimeStamp), "yyyy-MM-dd-hh-mm-ss"); + String[] timeStrs = currTime.split("-"); + currYear = Integer.parseInt(timeStrs[0]); + currMonth = Integer.parseInt(timeStrs[1]); + currDay = Integer.parseInt(timeStrs[2]); + currHour = Integer.parseInt(timeStrs[3]); + currMin = Integer.parseInt(timeStrs[4]); + currSecond = Integer.parseInt(timeStrs[5]); + + startTimePicker = new MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_12H) + .setHour(currHour) + .setMinute(currMin) + .setTitleText("开始时间选择") + .setPositiveButtonText("确认") + .setNegativeButtonText("取消") + .build(); + endTimePicker = new MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_12H) + .setHour(currHour) + .setMinute(currMin) + .setTitleText("结束时间选择") + .setPositiveButtonText("确认") + .setNegativeButtonText("取消") + .build(); + + intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + int resultCode = result.getResultCode(); + System.out.println("registerForActivityResult..........................."); + if (resultCode == 100) { + assert data != null; + getIntent().putExtras(data.getExtras()); + String latLon = getIntent().getExtras().getString(ModelFieldConstants.LOCATION); + if(!TextUtils.isEmpty(latLon)){ + etLocation.setText(latLon); + } + }else if(resultCode == 200){ + assert data != null; + getIntent().putExtras(data.getExtras()); + bundle = getIntent().getExtras(); + courseName = bundle.getString(ModelFieldConstants.COURSE_NAME); + if(courseName != null){ + tvCourseName.setText(courseName); + } + } + }); + + setClickListener(); + } + + /** + * 设置点击事件 + */ + private void setClickListener(){ + tvCourseName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(CreateSign.this, ChooseCourse.class); + intent.putExtras(getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + } + }); + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + //点击添加图片 + ivAddImg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String signCode = Objects.requireNonNull(etCode.getText()).toString(); + if (TextUtils.isEmpty(signCode)){ + Toast.makeText(CreateSign.this, "请先输入签到码", Toast.LENGTH_SHORT).show(); + }else{ + Bitmap codeBitmap = QRCodeUtil.createQRCode(signCode,500,500,null); + ivAddImg.setImageBitmap(codeBitmap); + } + } + }); + //设置回调方法,进行获取选择的时间,并将其刷新到界面 + startTimePicker.addOnPositiveButtonClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int startHour = startTimePicker.getHour(); + int startMin = startTimePicker.getMinute(); + String startTime = String.valueOf(currYear) + "-" + + String.valueOf(currMonth) + "-" + + String.valueOf(currDay) + " " + + String.valueOf(startHour) + ":" + + String.valueOf(startMin) + ":" + "00"; + try { + startTimeStamp = Long.parseLong(CommonUtils.dateToStamp(startTime, "yyyy-MM-dd hh:mm:ss")); + } catch (ParseException e) { + e.printStackTrace(); + } + etStartTime.setText(startTime); + hasChooseStartTime = true; + } + }); + endTimePicker.addOnPositiveButtonClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int endHour = endTimePicker.getHour(); + int endMin = endTimePicker.getMinute(); + String endTime = String.valueOf(currYear) + "-" + + String.valueOf(currMonth) + "-" + + String.valueOf(currDay) + " " + + String.valueOf(endHour) + ":" + + String.valueOf(endMin) + ":" + "00"; + try { + endTimeStamp = Long.parseLong(CommonUtils.dateToStamp(endTime, "yyyy-MM-dd hh:mm:ss")); + } catch (ParseException e) { + e.printStackTrace(); + } + etEndTime.setText(endTime); + hasChooseEndTime = true; + } + }); + //课程开始时间 + etStartTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!startTimePicker.isAdded()){ + startTimePicker.show(getSupportFragmentManager(), "Hello"); + } + } + }); + //课程结束时间 + etEndTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!endTimePicker.isAdded()){ + endTimePicker.show(getSupportFragmentManager(), "Hello"); + } + } + }); + //定位 + etLocation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(CreateSign.this, MapActivity.class); + intent.putExtras(getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + +// etLocation.setText("定位"); + } + }); + //保存按钮 + abBtSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bundle = getIntent().getExtras(); + String courseName = bundle.getString(ModelFieldConstants.COURSE_NAME); + String stuAmountStr = Objects.requireNonNull(etStuAmount.getText()).toString(); + String location = Objects.requireNonNull(etLocation.getText()).toString(); + String signCodeStr = Objects.requireNonNull(etCode.getText()).toString(); + Long courseId = bundle.getLong(ModelFieldConstants.COURSE_ID); + Long userId = bundle.getLong(ModelFieldConstants.ID); + if(!TextUtils.isEmpty(courseName)){ + if(!TextUtils.isEmpty(stuAmountStr)){ + if(hasChooseStartTime && hasChooseEndTime){ + if(startTimeStamp <= endTimeStamp){ + if(!TextUtils.isEmpty(location)){ + if(!TextUtils.isEmpty(signCodeStr)){ + try{ + Long stuAmount = Long.parseLong(stuAmountStr); + try{ + Long signCode = Long.parseLong(signCodeStr); + CourseCreateSignRequest courseCreateSignRequest = new CourseCreateSignRequest(); + courseCreateSignRequest.setCourseName(courseName); + courseCreateSignRequest.setTotal(stuAmount); + courseCreateSignRequest.setBeginTime(startTimeStamp); + courseCreateSignRequest.setEndTime(endTimeStamp); + courseCreateSignRequest.setCourseAddr(location); + courseCreateSignRequest.setCourseId(courseId); + courseCreateSignRequest.setUserId(userId); + courseCreateSignRequest.setSignCode(signCode); + handler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 200){ + String error = (String) msg.obj; + Toast.makeText(CreateSign.this, error, Toast.LENGTH_SHORT).show(); + }else if(msg.arg1 == 100){ + Toast.makeText(CreateSign.this, "创建签到成功", Toast.LENGTH_SHORT).show(); + //创建成功后直接结束当前活动,并且跳到查看签到状态 + Intent intent = new Intent(); + bundle = getIntent().getExtras(); + bundle.putLong(ModelFieldConstants.NOW_SIGN_COURSE_ID, courseId); + bundle.putString(ModelFieldConstants.NOW_SIGN_COURSE_NAME, courseName); + intent.putExtras(bundle); + setResult(100,intent); + finish(); + } + return false; + } + }); + createSign(courseCreateSignRequest); + }catch (NumberFormatException numberFormatException){ + Toast.makeText(CreateSign.this, "请输入数字作为签到码", Toast.LENGTH_SHORT).show(); + } + }catch (NumberFormatException numberFormatException){ + Toast.makeText(CreateSign.this, "请输入正确的签到人数", Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(CreateSign.this, "请先输入签到口令", Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(CreateSign.this, "请先选择签到地点", Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(CreateSign.this, "时间设置错误", Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(CreateSign.this, "请先选择开始结束时间", Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(CreateSign.this, "请先输入待签到人数", Toast.LENGTH_SHORT).show(); + } + }else{ + Toast.makeText(CreateSign.this, "请先选择课程", Toast.LENGTH_SHORT).show(); + } + } + }); + } + + + private void createSign(CourseCreateSignRequest courseCreateSignRequest){ + new Thread(new Runnable() { + @Override + public void run() { + System.out.println( "courseCreateSignRequest : " + courseCreateSignRequest.toString() + ".............................."); + String json = JSON.toJSONString(courseCreateSignRequest); + String url = UrlConstants.TEACHER_INITIATE; + + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.arg1 = 100; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.arg1 = 200; + message.obj = baseResponse.getMsg(); + handler.sendMessage(message); + } + }.postConnect(url, json); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/ModifyUserInfo.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/ModifyUserInfo.java new file mode 100644 index 0000000..e2bd62e --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/ModifyUserInfo.java @@ -0,0 +1,402 @@ +package com.example.stlink.activitys.fragmentChild.activityUserInfo; + +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatButton; + +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import com.google.android.material.textfield.TextInputEditText; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Objects; + +public class ModifyUserInfo extends AppCompatActivity { + + private TextView abTvTitle; + private ImageView abIvTitle; + private AppCompatButton abBtSave; + private TextInputEditText tiNewMsg; + + private Handler handler; + private Bundle bundle; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_modify_user_info); + + initView(); + } + + + /** + * 初始胡布局 + */ + private void initView(){ + abTvTitle = findViewById(R.id.ab_tv_title); + abIvTitle = findViewById(R.id.ab_iv_title); + abBtSave = findViewById(R.id.ab_bt_save); + tiNewMsg = findViewById(R.id.ti_new_msg); + + refreshData(); + //设置监听器 + setListener(); + } + + /** + * 刷新数据 + */ + private void refreshData(){ + bundle = getIntent().getExtras(); + String toBeModify = (String) bundle.get(ModelFieldConstants.TO_BE_MODIFY); + switch (toBeModify){ + case ModelFieldConstants.USER_NAME : { + abTvTitle.setText("更换昵称"); + String userName = (String) bundle.get(ModelFieldConstants.USER_NAME); + if(userName != null){ + tiNewMsg.setText(userName); + }else{ + tiNewMsg.setText(""); + } + tiNewMsg.setSelection(tiNewMsg.getText().length()); + break; + } + case ModelFieldConstants.COLLEGE_NAME : { + abTvTitle.setText("更换大学"); + String schoolName = (String) bundle.get(ModelFieldConstants.COLLEGE_NAME); + if(schoolName != null){ + tiNewMsg.setText(schoolName); + }else{ + tiNewMsg.setText(""); + } + tiNewMsg.setSelection(tiNewMsg.getText().length()); + break; + } + case ModelFieldConstants.REAL_NAME : { + abTvTitle.setText("真实姓名验证"); + String realName = (String) bundle.get(ModelFieldConstants.REAL_NAME); + if(realName != null){ + tiNewMsg.setText(realName); + }else{ + tiNewMsg.setText(""); + } + tiNewMsg.setSelection(tiNewMsg.getText().length()); + break; + } + case ModelFieldConstants.ID_NUMBER : { + if ((bundle.getInt(ModelFieldConstants.ROLE_ID) == 0)) { + abTvTitle.setText("更换学号"); + } else { + abTvTitle.setText("更换工号"); + } + Long idNumber = (Long) bundle.get(ModelFieldConstants.ID_NUMBER); + if(idNumber != null){ + tiNewMsg.setText(String.valueOf(idNumber)); + }else{ + tiNewMsg.setText(""); + } + tiNewMsg.setSelection(tiNewMsg.getText().length()); + break; + } + case ModelFieldConstants.GENDER : { + //修改性别的时候,不能单纯的输入了,无法保证用户的输入内容,所以采用对话框的形式 + abTvTitle.setText("更换性别"); + Boolean sex = (Boolean) bundle.get(ModelFieldConstants.GENDER); + if(sex != null){ + if(sex){ + tiNewMsg.setText("男"); + }else{ + tiNewMsg.setText("女"); + } + } + //禁止编辑 + tiNewMsg.setFocusableInTouchMode(false); + //不可粘贴,长按不会弹出粘贴框 + tiNewMsg.setKeyListener(null); + + + tiNewMsg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + System.out.println("choose gender............"); + String[] singleItems = {"男", "女"}; + int checkedItem = "男".equals(tiNewMsg.getText().toString()) ? 0 : 1; + + MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ModifyUserInfo.this) + .setTitle("请选择性别") + .setNeutralButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }) + .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + tiNewMsg.setText(singleItems[bundle.getInt("checkedItem")]); + } + }) + .setSingleChoiceItems(singleItems, checkedItem, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + bundle.putInt("checkedItem", which); + } + }); + materialAlertDialogBuilder.show(); + } + + }); + break; + } + case ModelFieldConstants.EMAIL : { + abTvTitle.setText("更换邮箱"); + String email = (String) bundle.get(ModelFieldConstants.EMAIL); + if(email != null){ + tiNewMsg.setText(email); + }else{ + tiNewMsg.setText(""); + } + tiNewMsg.setSelection(tiNewMsg.getText().length()); + break; + } + case ModelFieldConstants.PHONE : { + abTvTitle.setText("更换电话号码"); + String phone = (String) bundle.get(ModelFieldConstants.PHONE); + if(phone != null){ + tiNewMsg.setText(phone); + }else{ + tiNewMsg.setText(""); + } + tiNewMsg.setSelection(tiNewMsg.getText().length()); + break; + } + default:{ + tiNewMsg.setText("error....."); + } + } + } + + /** + * 实时的监听文本框输入情况 + */ + private void setListener(){ + //返回上一个活动,也就是个人信息部分 + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + tiNewMsg.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + //当输入框文本发生修改时,启动保存按钮,并且为按钮绑定点击监听事件 + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + //启用保存按钮 + abBtSave.setEnabled(true); + //修改按钮样式选择器 + abBtSave.setBackgroundResource(R.drawable.selector_bottom_modify_info_save_2); + abBtSave.setTextColor(Color.WHITE); + //为按钮添加点击事件 + abBtSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog(); + } + }); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + } + + /** + * 确认对话框 + */ + private void dialog(){ + + AlertDialog alertDialog2 = new AlertDialog.Builder(this) + .setMessage("请确认是否进行" + abTvTitle.getText()) + .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + modifyInfo(); + handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + Toast.makeText(ModifyUserInfo.this, msg.obj.toString(), Toast.LENGTH_SHORT).show(); + } + }; + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + } + }) + .create(); + alertDialog2.show(); + } + + /** + * 更新信息网络请求 + */ + private void modifyInfo(){ + new Thread(new Runnable() { + @Override + public void run() { + JSONObject jsonObject = new JSONObject(); + Boolean isLegalInput = false; + try { + jsonObject.put(ModelFieldConstants.ID, (Long) bundle.get(ModelFieldConstants.ID)); + } catch (JSONException e) { + e.printStackTrace(); + } + //根据上一个活动传递过来的选择字段,来选择对应的传输方法 + String modifyField = (String) bundle.get(ModelFieldConstants.TO_BE_MODIFY); + switch (modifyField){ + case ModelFieldConstants.ID_NUMBER: + case ModelFieldConstants.IN_SCHOOL_TIME:{ + try { + Long msg = Long.parseLong(Objects.requireNonNull(tiNewMsg.getText()).toString()); + jsonObject.put(modifyField, msg); + bundle.putLong(modifyField, msg); + isLegalInput = true; + }catch (NumberFormatException e){ + e.printStackTrace(); + Message msg = new Message(); + msg.obj = "输入非法."; + handler.sendMessage(msg); + }catch (JSONException e) { + e.printStackTrace(); + } + break; + } + case ModelFieldConstants.GENDER:{ + try { + String msg = Objects.requireNonNull(tiNewMsg.getText()).toString(); + if("男".equals(msg) || "女".equals(msg)){ + Boolean msgBoolean = "男".equals(msg); + jsonObject.put(modifyField, msgBoolean); + bundle.putBoolean(modifyField, msgBoolean); + isLegalInput = true; + } + } catch (JSONException e) { + e.printStackTrace(); + } + break; + } + case ModelFieldConstants.PHONE: { + try { + String msg = Objects.requireNonNull(tiNewMsg.getText()).toString(); + //判断输入电话号码是否能解析为long型,能解析的话说明输入没有非法字符 + Long msgLong = Long.parseLong(msg); + jsonObject.put(modifyField, msg); + bundle.putString(modifyField, msg); + isLegalInput = true; + }catch (NumberFormatException e){ + e.printStackTrace(); + Message msg = new Message(); + msg.obj = "输入非法."; + handler.sendMessage(msg); + }catch (JSONException e) { + e.printStackTrace(); + } + break; + } + case ModelFieldConstants.EMAIL:{ + Message message = new Message(); + try { + String msg = Objects.requireNonNull(tiNewMsg.getText()).toString(); + String[] msgStr = msg.split("@"); + //必须得包含@符号 + if(msgStr.length == 2){ + //邮箱的两部分必定是长度大于0的 + if(msgStr[0].length() > 0 && msgStr[1].length() > 0){ + jsonObject.put(modifyField, msg); + bundle.putString(modifyField, msg); + isLegalInput = true; + }else{ + message.obj = "输入非法."; + handler.sendMessage(message); + } + }else{ + message.obj = "输入非法."; + handler.sendMessage(message); + } + } catch (NumberFormatException e){ + e.printStackTrace(); + message.obj = "输入非法."; + handler.sendMessage(message); + }catch (JSONException e) { + e.printStackTrace(); + } + + break; + } + default:{ + try { + String msg = Objects.requireNonNull(tiNewMsg.getText()).toString(); + jsonObject.put(modifyField, msg); + bundle.putString(modifyField, msg); + isLegalInput = true; + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + System.out.println( "jsonObject : " + jsonObject.toString() + ".............................."); + String json = jsonObject.toString(); + String url = UrlConstants.USER_UPDATE; + + if(isLegalInput){ + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Intent intent = new Intent(); + intent.putExtras(bundle); + setResult(RESULT_OK,intent); + finish(); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + System.out.println("修改失败......................."); + handler.sendMessage(message); + } + }.postConnect(url, json); + } + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoAbout.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoAbout.java new file mode 100644 index 0000000..e5cfc51 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoAbout.java @@ -0,0 +1,18 @@ +package com.example.stlink.activitys.fragmentChild.activityUserInfo; + +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; +import com.example.stlink.utils.CommonUtils; + +public class UserInfoAbout extends AppCompatActivity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_detail_about); + CommonUtils.changeStatusBar(this); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoDetail.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoDetail.java new file mode 100644 index 0000000..bf89257 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoDetail.java @@ -0,0 +1,320 @@ +package com.example.stlink.activitys.fragmentChild.activityUserInfo; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestOptions; +import com.donkingliang.imageselector.utils.ImageSelector; +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.activityUtil.ImgUploadUtil; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class UserInfoDetail extends AppCompatActivity { + + private ConstraintLayout clHeadImg; + private ConstraintLayout clUserName; + private ConstraintLayout clSchoolName; + private ConstraintLayout clRealName; + private ConstraintLayout clIdNumber; + private ConstraintLayout clSex; + private ConstraintLayout clCreateTime; + private ConstraintLayout clEmail; + private ConstraintLayout clPhone; + + private ImageView ivHeadImg; + private TextView tvUserNameMsg; + private TextView tvSchoolMsg; + private TextView tvRealNameMsg; + private TextView tvIdNumberMsg; + private TextView tvSexMsg; + private TextView tvCreateTimeMsg; + private TextView tvEmailMsg; + private TextView tvPhoneMsg; + private TextView tvIdNumber; + private ImageView abIvTitle; + + private Bundle bundle; + + private ActivityResultLauncher intentActivityResultLauncher; + + private ArrayList arrayList; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_detail_my_info); + CommonUtils.changeStatusBar(this); + + initView(); + } + + + /** + * 初始化页面 + */ + public void initView(){ + clHeadImg = findViewById(R.id.cl_head_img); + clUserName = findViewById(R.id.cl_user_name); + clSchoolName = findViewById(R.id.cl_school_name); + clRealName = findViewById(R.id.cl_real_name); + clIdNumber = findViewById(R.id.cl_id_number); + clSex = findViewById(R.id.cl_sex); + clCreateTime = findViewById(R.id.cl_create_time); + clEmail = findViewById(R.id.cl_email); + clPhone = findViewById(R.id.cl_phone); + + ivHeadImg = findViewById(R.id.iv_head_img); + tvUserNameMsg = findViewById(R.id.tv_user_name_msg); + tvSchoolMsg = findViewById(R.id.tv_school_msg); + tvRealNameMsg = findViewById(R.id.tv_real_name_msg); + tvIdNumberMsg = findViewById(R.id.tv_id_number_msg); + tvSexMsg = findViewById(R.id.tv_sex_msg); + tvCreateTimeMsg = findViewById(R.id.tv_create_time_msg); + tvEmailMsg = findViewById(R.id.tv_email_msg); + tvPhoneMsg = findViewById(R.id.tv_phone_msg); + tvIdNumber = findViewById(R.id.tv_id_number); + abIvTitle = findViewById(R.id.ab_iv_title); + + intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + int resultCode = result.getResultCode(); + System.out.println("registerForActivityResult..........................."); + if (resultCode == RESULT_OK) { + assert data != null; + getIntent().putExtras(data.getExtras()); + refreshData(); + }else if (resultCode == 100){ + assert data != null; + ArrayList images = data.getStringArrayListExtra( + ImageSelector.SELECT_RESULT); + + } + }); + + refreshData(); + + initOnClickListener(); + } + + //用于图片选择器选择图片之后的回调,来完成图片上传和刷新本地 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 100 && data != null) { + //获取选择器返回的数据 + ArrayList images = data.getStringArrayListExtra( + ImageSelector.SELECT_RESULT); + String url = images.get(0); + Handler handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + bundle = (Bundle) msg.obj; + if(bundle.getBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS)){ + System.out.println("refreshData.................."); + getIntent().putExtras(bundle); + refreshData(); + }else{ + Toast.makeText(UserInfoDetail.this, "修改失败", Toast.LENGTH_SHORT).show(); + } + } + }; + ImgUploadUtil.userImgUpload(bundle, handler, url, ModelFieldConstants.AVATAR); + /** + * 是否是来自于相机拍照的图片, + * 只有本次调用相机拍出来的照片,返回时才为true。 + * 当为true时,图片返回的结果有且只有一张图片。 + */ + boolean isCameraImage = data.getBooleanExtra(ImageSelector.IS_CAMERA_IMAGE, false); + } + } + + private void refreshData(){ + bundle = getIntent().getExtras(); + int roleId = bundle.getInt(ModelFieldConstants.ROLE_ID); + String avatar = (String) bundle.get(ModelFieldConstants.AVATAR); + String schoolName = (String) bundle.get(ModelFieldConstants.COLLEGE_NAME); + String userNameMsg = (String) bundle.get(ModelFieldConstants.USER_NAME); + String realNameMsg = (String) bundle.get(ModelFieldConstants.REAL_NAME); + Long idNumberMsg = (Long) bundle.get(ModelFieldConstants.ID_NUMBER); + Boolean sexMsg = bundle.getBoolean(ModelFieldConstants.GENDER); + Long createTimeMsg = (Long) bundle.get(ModelFieldConstants.CREATE_TIME); + String emailMsg = (String) bundle.get(ModelFieldConstants.EMAIL); + String phoneMsg = (String) bundle.get(ModelFieldConstants.PHONE); + + if(roleId == 0){ + ivHeadImg.setImageResource(R.mipmap.student); + tvIdNumber.setText("学号"); + } + if(avatar != null){ + Glide.with(getApplicationContext()) + .load(avatar) + //添加圆角 + .apply(new RequestOptions().bitmapTransform(new RoundedCorners(30))) + .into(ivHeadImg); + } + if(schoolName != null){ + tvSchoolMsg.setText(schoolName); + } + if(userNameMsg != null){ + tvUserNameMsg.setText(userNameMsg); + } + if(realNameMsg != null){ + tvRealNameMsg.setText(realNameMsg); + } + if(idNumberMsg != null){ + tvIdNumberMsg.setText(String.valueOf(idNumberMsg)); + } + if(sexMsg != null){ + if(sexMsg){ + tvSexMsg.setText("男"); + }else{ + tvSexMsg.setText("女"); + } + } + if(createTimeMsg != null){ + Date date = new Date(createTimeMsg); + @SuppressLint("SimpleDateFormat") + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + tvCreateTimeMsg.setText(sd.format(date)); + } + if(emailMsg != null){ + tvEmailMsg.setText(emailMsg); + } + if(phoneMsg != null){ + tvPhoneMsg.setText(phoneMsg); + } + + } + + + /** + * 初始化按钮事件 + */ + public void initOnClickListener(){ + //头像 + clHeadImg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //调用第三方开源库,单选并剪裁 + ImageSelector.builder() + .useCamera(true) // 设置是否使用拍照 + .setCrop(true) // 设置是否使用图片剪切功能。 + .setCropRatio(1.0f) // 图片剪切的宽高比,默认1.0f。宽固定为手机屏幕的宽。 + .setSingle(true) //设置是否单选 + .canPreview(true) //是否可以预览图片,默认为true + .start(UserInfoDetail.this, 100); // 打开相册 + } + }); + clUserName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.USER_NAME); + intent.putExtras(bundle); + + intentActivityResultLauncher.launch(intent); + } + }); + clSchoolName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.COLLEGE_NAME); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + clRealName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.REAL_NAME); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + clIdNumber.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.ID_NUMBER); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + clSex.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.GENDER); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + clCreateTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + clEmail.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.EMAIL); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + clPhone.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoDetail.this, ModifyUserInfo.class); + Bundle bundle = getIntent().getExtras(); + bundle.putString(ModelFieldConstants.TO_BE_MODIFY, ModelFieldConstants.PHONE); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + //返回上一个活动,也就是个人信息部分 + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(); + intent.putExtras(bundle); + setResult(RESULT_OK,intent); + finish(); + } + }); + + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoRecord.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoRecord.java new file mode 100644 index 0000000..01b9e83 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoRecord.java @@ -0,0 +1,43 @@ +package com.example.stlink.activitys.fragmentChild.activityUserInfo; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; +import com.example.stlink.utils.CommonUtils; + +public class UserInfoRecord extends AppCompatActivity { + + private ImageView abIvTitle; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_detail_record); + + initView(); + } + + private void initView(){ + + CommonUtils.changeStatusBar(this); + + abIvTitle = findViewById(R.id.ab_iv_title); + setClickListener(); + } + + + private void setClickListener(){ + //返回上一个活动,也就是个人信息部分 + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } +} diff --git a/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoSetting.java b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoSetting.java new file mode 100644 index 0000000..ea9fc43 --- /dev/null +++ b/app/src/main/java/com/example/stlink/activitys/fragmentChild/activityUserInfo/UserInfoSetting.java @@ -0,0 +1,67 @@ +package com.example.stlink.activitys.fragmentChild.activityUserInfo; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.activitys.IdChooseActivity; +import com.example.stlink.R; +import com.example.stlink.utils.CommonUtils; + +public class UserInfoSetting extends AppCompatActivity { + + private Button btExit; + private Button btLoginOut; + private ImageView abIvTitle; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_user_detail_setting); + + initView(); + } + + private void initView(){ + + CommonUtils.changeStatusBar(this); + btExit = findViewById(R.id.bt_exit); + btLoginOut = findViewById(R.id.bt_login_out); + abIvTitle = findViewById(R.id.ab_iv_title); + + setClickListener(); + } + + private void setClickListener(){ + btExit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// finish();//这个只是从方法栈中移除了当前活动 +// System.exit(0); //同上 + CommonUtils.exitApp(UserInfoSetting.this); + } + }); + + btLoginOut.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(UserInfoSetting.this, IdChooseActivity.class); + //退出登录后,禁止再退回来 + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + }); + //返回上一个活动,也就是个人信息部分 + abIvTitle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } +} diff --git a/app/src/main/java/com/example/stlink/configs/IAdapter.java b/app/src/main/java/com/example/stlink/configs/IAdapter.java new file mode 100644 index 0000000..c144b93 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/IAdapter.java @@ -0,0 +1,24 @@ +package com.example.stlink.configs; + +public interface IAdapter { + /* + * Item 单击事件后续处理 + */ + interface OnRVItemClickListener { + void onClick(int position); + } + + /* + * Item 长按事件后续处理 + */ + interface OnRVItemLongClickListener { + boolean onLongClick(int position); + } + + /* + * Item 移除事件后续处理 + */ + interface OnRVItemRemoveListener{ + void onRemove(int position); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/configs/MapApplication.java b/app/src/main/java/com/example/stlink/configs/MapApplication.java new file mode 100644 index 0000000..912be4c --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/MapApplication.java @@ -0,0 +1,30 @@ +package com.example.stlink.configs; + +import android.app.Application; + +import com.baidu.mapapi.CoordType; +import com.baidu.mapapi.SDKInitializer; +import com.baidu.mapapi.common.BaiduMapSDKException; + + +public class MapApplication extends Application { + + @Override + public void onCreate() { + super.onCreate(); + + // 是否同意隐私政策,默认为false + SDKInitializer.setAgreePrivacy(this, true); + try { + // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext + SDKInitializer.initialize(this); + } catch (BaiduMapSDKException e) { + e.printStackTrace(); + } + + //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型. + //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。 + SDKInitializer.setCoordType(CoordType.BD09LL); + } + +} diff --git a/app/src/main/java/com/example/stlink/configs/MySQLiteOpenHelper.java b/app/src/main/java/com/example/stlink/configs/MySQLiteOpenHelper.java new file mode 100644 index 0000000..6d0f741 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/MySQLiteOpenHelper.java @@ -0,0 +1,38 @@ +package com.example.stlink.configs; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import androidx.annotation.Nullable; + +/** + * 主要用于建库和建表 + */ +public class MySQLiteOpenHelper extends SQLiteOpenHelper { + + private final String SQL_CREATE_ENTRIES; + private final String SQL_DELETE_ENTRIES; + + public MySQLiteOpenHelper(@Nullable Context context, + @Nullable String dbName, + @Nullable SQLiteDatabase.CursorFactory factory, + int version, + @Nullable String sqlCreateEntries, + @Nullable String sqlDeleteEntries) { + super(context, dbName, factory, version); + SQL_CREATE_ENTRIES = sqlCreateEntries; + SQL_DELETE_ENTRIES = sqlDeleteEntries; + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(SQL_CREATE_ENTRIES); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL(SQL_DELETE_ENTRIES); + onCreate(db); + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/CourseChooseAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/CourseChooseAdapter.java new file mode 100644 index 0000000..ecaf8f4 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/CourseChooseAdapter.java @@ -0,0 +1,88 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.example.stlink.R; +import com.example.stlink.model.domain.Course; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class CourseChooseAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; + private RecyclerView rvParent; + + private final List mCourseData; + + private final Context mContext; + private final int resourceId; + + public CourseChooseAdapter(@NonNull Context context, int resourceId, @NonNull List data) { + this.mContext = context; + this.mCourseData = data; + this.resourceId = resourceId; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + + View view = LayoutInflater.from(mContext) + .inflate(resourceId, parent, false); + ViewHolder holder = new ViewHolder(view); + view.setOnClickListener(this); + + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Course course = mCourseData.get(position); + Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto); + holder.tvCourseName.setText(course.getmCourseName()); + } + + @Override + public int getItemCount() { + return mCourseData.size(); + } + + //重载点击事件,指定点击事件时执行自定义的onItemClick + @Override + public void onClick(View view) { + int position = rvParent.getChildAdapterPosition(view); + if (onRecyclerViewItemClickListener != null){ + onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); + } + } + + //实例化自定义接口 + public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { + this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + ImageView ivCoursePhoto; + TextView tvCourseName; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo); + tvCourseName = itemView.findViewById(R.id.tv_course_name); + } + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/LocationPoiAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/LocationPoiAdapter.java new file mode 100644 index 0000000..4a17839 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/LocationPoiAdapter.java @@ -0,0 +1,93 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.baidu.mapapi.search.core.PoiInfo; +import com.example.stlink.R; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class LocationPoiAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; + private RecyclerView rvParent; + + + private List mItems; + private final Context mContext; +// private LayoutInflater mInflater; + + + public LocationPoiAdapter(@NonNull Context mContext, @NonNull List mItems) { + this.mItems = mItems; + this.mContext = mContext; +// this.mInflater=LayoutInflater.from(mContext); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + View view = LayoutInflater.from(mContext) + .inflate(R.layout.card_location_poi, parent, false); + view.setOnClickListener(this); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + holder.tvBuildingName.setText(mItems.get(position).name); + holder.tvBuildingDescription.setText(mItems.get(position).address); + System.out.println("LocationPoiAdapter : holder : " + holder); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + //重载点击事件,指定点击事件时执行自定义的onItemClick + @Override + public void onClick(View view) { + int position = rvParent.getChildAdapterPosition(view); + if (onRecyclerViewItemClickListener != null){ + onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); + } + } + + //实例化自定义接口 + public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { + this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView tvBuildingName; + TextView tvBuildingDescription; + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvBuildingName = itemView.findViewById(R.id.tv_building_name); + tvBuildingDescription = itemView.findViewById(R.id.tv_building_description); + } + + @Override + public String toString() { + return "ViewHolder{" + + "tvBuildingName=" + tvBuildingName + + ", tvBuildingDescription=" + tvBuildingDescription + + '}'; + } + } + +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/StuAddCourseAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/StuAddCourseAdapter.java new file mode 100644 index 0000000..14812d2 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/StuAddCourseAdapter.java @@ -0,0 +1,189 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.example.stlink.R; +import com.example.stlink.fragments.StuHomeFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class StuAddCourseAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; + private RecyclerView rvParent; + + private final List mCourseData; + + private final Context mContext; + private final int resourceId; + private int role; + + private Handler handler; + + public StuAddCourseAdapter(@NonNull Context context, int resourceId, @NonNull List data, int role) { + this.mContext = context; + this.mCourseData = data; + this.resourceId = resourceId; + this.role = role; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + + View view = LayoutInflater.from(mContext) + .inflate(resourceId, parent, false); + ViewHolder holder = new ViewHolder(view); + view.setOnClickListener(this); + + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Course course = mCourseData.get(position); + Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto); + holder.tvCourseName.setText(course.getmCourseName()); + holder.tvCollegeName.setText(course.getmCollegeName()); + setAddClickListener(holder, position); + } + + @Override + public int getItemCount() { + return mCourseData.size(); + } + + //重载点击事件,指定点击事件时执行自定义的onItemClick + @Override + public void onClick(View view) { + int position = rvParent.getChildAdapterPosition(view); + if (onRecyclerViewItemClickListener != null){ + onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); + } + } + + + //实例化自定义接口 + public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { + this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + ImageView ivCoursePhoto; + TextView tvCourseName; + TextView tvCollegeName; + ImageView ivRight; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo); + tvCourseName = itemView.findViewById(R.id.tv_course_name); + tvCollegeName = itemView.findViewById(R.id.tv_college_name); + ivRight = itemView.findViewById(R.id.cv_right); + } + } + + /** + * 添加删除事件,云端删除成功后,子线程个主线程发送信息,请求课程列表进行刷新 + * @param holder 当前card的相关数据 + * @param position 位置 + */ + public void setAddClickListener(ViewHolder holder, int position){ + holder.ivRight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog alertDialog2 = new AlertDialog.Builder(mContext) + .setMessage("确认加入课程") + .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + deleteCourse(position); + handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + Toast.makeText(mContext, msg.obj.toString(), Toast.LENGTH_SHORT).show(); + if(msg.arg1 == 200){ + Toast.makeText(mContext, "添加成功", Toast.LENGTH_SHORT).show(); + AppCompatActivity appCompatActivity = (AppCompatActivity) mContext; + appCompatActivity.finish(); + //刷新数据 + StuHomeFragment.refreshData(); + } + } + }; + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消 + @Override + public void onClick(DialogInterface dialogInterface, int i) { } + }) + .create(); + alertDialog2.show(); + } + }); + } + + /** + * 更新信息网络请求 + */ + private void deleteCourse(int position){ + new Thread(new Runnable() { + @Override + public void run() { + AppCompatActivity appCompatActivity = (AppCompatActivity) mContext; + Bundle bundle = appCompatActivity.getIntent().getExtras(); + Long courseId = mCourseData.get(position).getmCourseId(); + long userId = bundle.getLong(ModelFieldConstants.ID); + String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + userId; + String url = UrlConstants.STUDENT_SELECT + "?" + urlParam; + + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = "添加成功"; + message.arg1 = 200; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + System.out.println("添加失败......................."); + message.obj = "添加失败"; + message.arg1 = 400; + handler.sendMessage(message); + } + }.postConnect(url, ""); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/StuClassListFragAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/StuClassListFragAdapter.java new file mode 100644 index 0000000..fecf810 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/StuClassListFragAdapter.java @@ -0,0 +1,98 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.stlink.R; +import com.example.stlink.model.domain.CourseSign; +import com.example.stlink.utils.CommonUtils; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class StuClassListFragAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; + private RecyclerView rvParent; + + private final List mCourseSign; + + private final Context mContext; + private final int resourceId; + private int role; + + private Handler handler; + + public StuClassListFragAdapter(@NonNull Context context, int resourceId, @NonNull List mCourseSign, int role) { + this.mContext = context; + this.mCourseSign = mCourseSign; + this.resourceId = resourceId; + this.role = role; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + + View view = LayoutInflater.from(mContext) + .inflate(resourceId, parent, false); + ViewHolder holder = new ViewHolder(view); + view.setOnClickListener(this); + + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + CourseSign courseSign = mCourseSign.get(position); + System.out.println("mCourseSign[" + position + "]: " + courseSign); + holder.tvCourseName.setText(courseSign.getCourseName()); + holder.tvSignAddress.setText(courseSign.getCourseAddr()); + Long signCreateTime = courseSign.getCreateTime(); + holder.tvCreateTime.setText(CommonUtils.stampToDate(String.valueOf(signCreateTime), "yyyy-MM-dd hh:mm:ss")); + + } + + @Override + public int getItemCount() { + return mCourseSign.size(); + } + + //重载点击事件,指定点击事件时执行自定义的onItemClick + @Override + public void onClick(View view) { + int position = rvParent.getChildAdapterPosition(view); + if (onRecyclerViewItemClickListener != null){ + onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); + } + } + + + //实例化自定义接口 + public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { + this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView tvCourseName; + TextView tvSignAddress; + TextView tvCreateTime; + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvCourseName = itemView.findViewById(R.id.tv_class_list_title); + tvSignAddress = itemView.findViewById(R.id.tv_sign_address); + tvCreateTime = itemView.findViewById(R.id.tv_create_time); + } + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/StuCourseSignedAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/StuCourseSignedAdapter.java new file mode 100644 index 0000000..29f9e5b --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/StuCourseSignedAdapter.java @@ -0,0 +1,76 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.stlink.R; +import com.example.stlink.model.domain.CourseSign; +import com.example.stlink.utils.CommonUtils; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class StuCourseSignedAdapter extends RecyclerView.Adapter{ + + private RecyclerView rvParent; + + private final List mCourseSign; + + private final Context mContext; + private final int resourceId; + private int role; + + private Handler handler; + + public StuCourseSignedAdapter(@NonNull Context context, int resourceId, @NonNull List mCourseSign, int role) { + this.mContext = context; + this.mCourseSign = mCourseSign; + this.resourceId = resourceId; + this.role = role; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + + View view = LayoutInflater.from(mContext) + .inflate(resourceId, parent, false); + ViewHolder holder = new ViewHolder(view); + + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + CourseSign courseSign = mCourseSign.get(position); + System.out.println("mCourseSign[" + position + "]: " + courseSign); + Long signedTimeStamp = courseSign.getCreateTime(); + holder.tvSignedTime.setText(CommonUtils.stampToDate(String.valueOf(signedTimeStamp), "yyyy-MM-dd hh:mm:ss")); + + } + + @Override + public int getItemCount() { + return mCourseSign.size(); + } + + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView tvSignedTime; + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvSignedTime = itemView.findViewById(R.id.tv_signed_time); + } + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/StuDeleteCourseAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/StuDeleteCourseAdapter.java new file mode 100644 index 0000000..0ce89e7 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/StuDeleteCourseAdapter.java @@ -0,0 +1,186 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.example.stlink.R; +import com.example.stlink.fragments.StuHomeFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.httpUtils.DeleteUrlParamHttpUtils; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class StuDeleteCourseAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; + private RecyclerView rvParent; + + private final List mCourseData; + + private final Context mContext; + private final int resourceId; + private int role; + + private Handler handler; + + public StuDeleteCourseAdapter(@NonNull Context context, int resourceId, @NonNull List data, int role) { + this.mContext = context; + this.mCourseData = data; + this.resourceId = resourceId; + this.role = role; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + + View view = LayoutInflater.from(mContext) + .inflate(resourceId, parent, false); + ViewHolder holder = new ViewHolder(view); + view.setOnClickListener(this); + + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Course course = mCourseData.get(position); + Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto); + holder.tvCourseName.setText(course.getmCourseName()); + holder.tvCollegeName.setText(course.getmCollegeName()); + setDeleteClickListener(holder, position); + } + + @Override + public int getItemCount() { + return mCourseData.size(); + } + + //重载点击事件,指定点击事件时执行自定义的onItemClick + @Override + public void onClick(View view) { + int position = rvParent.getChildAdapterPosition(view); + if (onRecyclerViewItemClickListener != null){ + onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); + } + } + + + //实例化自定义接口 + public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { + this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + ImageView ivCoursePhoto; + TextView tvCourseName; + TextView tvCollegeName; + ImageView ivRight; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo); + tvCourseName = itemView.findViewById(R.id.tv_course_name); + tvCollegeName = itemView.findViewById(R.id.tv_college_name); + ivRight = itemView.findViewById(R.id.cv_right); + } + } + + /** + * 添加删除事件,云端删除成功后,子线程个主线程发送信息,请求课程列表进行刷新 + * @param holder + * @param position + */ + public void setDeleteClickListener(ViewHolder holder, int position){ + holder.ivRight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog alertDialog2 = new AlertDialog.Builder(mContext) + .setMessage("确认退出课程") + .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + deleteCourse(position); + handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + Toast.makeText(mContext, msg.obj.toString(), Toast.LENGTH_SHORT).show(); + if(msg.arg1 == 200){ + StuHomeFragment.refreshData(); + } + } + }; + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + } + }) + .create(); + alertDialog2.show(); + } + }); + } + + /** + * 更新信息网络请求 + */ + private void deleteCourse(int position){ + new Thread(new Runnable() { + @Override + public void run() { + AppCompatActivity appCompatActivity = (AppCompatActivity) mContext; + Bundle bundle = appCompatActivity.getIntent().getExtras(); + Long courseId = mCourseData.get(position).getmCourseId(); + Long userId = bundle.getLong(ModelFieldConstants.ID); + String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + userId; + String url = UrlConstants.STUDENT_DROP + "?" + urlParam; + + new DeleteUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = "退出成功"; + message.arg1 = 200; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + System.out.println("退出失败......................."); + message.obj = "退出失败"; + message.arg1 = 400; + handler.sendMessage(message); + } + }.deleteConnect(url); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/TeaDeleteCourseAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/TeaDeleteCourseAdapter.java new file mode 100644 index 0000000..e5a7be7 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/TeaDeleteCourseAdapter.java @@ -0,0 +1,191 @@ +package com.example.stlink.configs.adapter; + +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.example.stlink.R; +import com.example.stlink.fragments.CrsFinishedListFragment; +import com.example.stlink.fragments.CrsUnfinishedListFragment; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.httpUtils.DeleteUrlParamHttpUtils; + +import java.util.List; + +/** + * 用于将课程数据渲染进ListView控件中进行显示 + */ +public class TeaDeleteCourseAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener; + private RecyclerView rvParent; + + private final List mCourseData; + + private final Context mContext; + private final int resourceId; + private int role; + + private Handler handler; + + public TeaDeleteCourseAdapter(@NonNull Context context, int resourceId, @NonNull List data, int role) { + this.mContext = context; + this.mCourseData = data; + this.resourceId = resourceId; + this.role = role; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //指定一个父控件 + rvParent = (RecyclerView) parent; + + View view = LayoutInflater.from(mContext) + .inflate(resourceId, parent, false); + ViewHolder holder = new ViewHolder(view); + view.setOnClickListener(this); + + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Course course = mCourseData.get(position); + Glide.with(mContext).load(course.getmCoursePhoto()).into(holder.ivCoursePhoto); + holder.tvCourseName.setText(course.getmCourseName()); + holder.tvCollegeName.setText(course.getmCollegeName()); + setDeleteClickListener(holder, position); + } + + @Override + public int getItemCount() { + return mCourseData.size(); + } + + //重载点击事件,指定点击事件时执行自定义的onItemClick + @Override + public void onClick(View view) { + int position = rvParent.getChildAdapterPosition(view); + if (onRecyclerViewItemClickListener != null){ + onRecyclerViewItemClickListener.onItemClick(rvParent, view, position); + } + } + + + //实例化自定义接口 + public void setOnItemClickListener(com.example.stlink.configs.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) { + this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + ImageView ivCoursePhoto; + TextView tvCourseName; + TextView tvCollegeName; + ImageView ivRight; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivCoursePhoto = itemView.findViewById(R.id.iv_course_photo); + tvCourseName = itemView.findViewById(R.id.tv_course_name); + tvCollegeName = itemView.findViewById(R.id.tv_college_name); + ivRight = itemView.findViewById(R.id.cv_right); + } + } + + /** + * 添加删除事件,云端删除成功后,子线程个主线程发送信息,请求课程列表进行刷新 + * @param holder + * @param position + */ + public void setDeleteClickListener(ViewHolder holder, int position){ + holder.ivRight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog alertDialog2 = new AlertDialog.Builder(mContext) + .setMessage("确认删除课程") + .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + deleteCourse(position); + handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + Toast.makeText(mContext, msg.obj.toString(), Toast.LENGTH_SHORT).show(); + if(msg.arg1 == 200){ + if(role == 0){ + CrsUnfinishedListFragment.refreshData(); + }else if (role == 1){ + CrsFinishedListFragment.refreshData(); + } + } + } + }; + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消 + @Override + public void onClick(DialogInterface dialogInterface, int i) { + } + }) + .create(); + alertDialog2.show(); + } + }); + } + + /** + * 更新信息网络请求 + */ + private void deleteCourse(int position){ + new Thread(new Runnable() { + @Override + public void run() { + AppCompatActivity appCompatActivity = (AppCompatActivity) mContext; + Bundle bundle = appCompatActivity.getIntent().getExtras(); + Long courseId = mCourseData.get(position).getmCourseId(); + Long userId = bundle.getLong(ModelFieldConstants.ID); + String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + userId; + String url = UrlConstants.TEACHER_COURSE + "?" + urlParam; + + new DeleteUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = "删除成功"; + message.arg1 = 200; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + System.out.println("删除失败......................."); + message.obj = "删除失败"; + message.arg1 = 400; + handler.sendMessage(message); + } + }.deleteConnect(url); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/configs/adapter/ViewPagerAdapter.java b/app/src/main/java/com/example/stlink/configs/adapter/ViewPagerAdapter.java new file mode 100644 index 0000000..bfe4be8 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/adapter/ViewPagerAdapter.java @@ -0,0 +1,39 @@ +package com.example.stlink.configs.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Lifecycle; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.List; + +/** + * 对碎片进行管理 + */ +public class ViewPagerAdapter extends FragmentStateAdapter { + + List list; + public ViewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle , List list) { + super(fragmentManager, lifecycle); + this.list = list; + } + + public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity, List list) { + super(fragmentActivity); + this.list = list; + } + + @Override + public int getItemCount() { + return list.size(); + } + + @NonNull + @Override + public Fragment createFragment(int position) { + return list.get(position); + } + +} diff --git a/app/src/main/java/com/example/stlink/configs/myControls/MyListView.java b/app/src/main/java/com/example/stlink/configs/myControls/MyListView.java new file mode 100644 index 0000000..f46b95d --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/myControls/MyListView.java @@ -0,0 +1,20 @@ +package com.example.stlink.configs.myControls; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ListView; + +/** + * 自定义ListView解决嵌套在ScrollView中时默认全展开 + */ +public class MyListView extends ListView { + public MyListView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int expandedSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, expandedSpec); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/configs/myControls/NestedScrollableHost.java b/app/src/main/java/com/example/stlink/configs/myControls/NestedScrollableHost.java new file mode 100644 index 0000000..e2c461e --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/myControls/NestedScrollableHost.java @@ -0,0 +1,143 @@ +package com.example.stlink.configs.myControls; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewParent; +import android.widget.FrameLayout; + +import java.util.HashMap; + +import androidx.annotation.Nullable; +import androidx.viewpager2.widget.ViewPager2; + +/** + * 此类用于解决 ViewPager2 嵌套 ViewPager2 或者 RecyclerView 等相互嵌套的冲突问题, + */ +public class NestedScrollableHost extends FrameLayout { + + private int touchSlop; + private float initialX; + private float initialY; + private HashMap _$_findViewCache; + + private final ViewPager2 getParentViewPager() { + ViewParent var10000 = this.getParent(); + if (!(var10000 instanceof View)) { + var10000 = null; + } + + View v; + for (v = (View) var10000; v != null && !(v instanceof ViewPager2); v = (View) var10000) { + var10000 = v.getParent(); + if (!(var10000 instanceof View)) { + var10000 = null; + } + } + + View var2 = v; + if (!(v instanceof ViewPager2)) { + var2 = null; + } + + return (ViewPager2) var2; + } + + private final View getChild() { + return this.getChildCount() > 0 ? this.getChildAt(0) : null; + } + + private final boolean canChildScroll(int orientation, float delta) { + boolean var5 = false; + int direction = -((int) Math.signum(delta)); + View var10000; + boolean var6 = false; + switch (orientation) { + case 0: + var10000 = this.getChild(); + var6 = var10000 != null ? var10000.canScrollHorizontally(direction) : false; + break; + case 1: + var10000 = this.getChild(); + var6 = var10000 != null ? var10000.canScrollVertically(direction) : false; + break; + default: + // throw (Throwable)(new IllegalArgumentException()); + } + + return var6; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent e) { + this.handleInterceptTouchEvent(e); + return super.onInterceptTouchEvent(e); + } + + private final void handleInterceptTouchEvent(MotionEvent e) { + ViewPager2 var10000 = this.getParentViewPager(); + if (var10000 != null) { + int orientation = var10000.getOrientation(); + if (this.canChildScroll(orientation, -1.0F) || this.canChildScroll(orientation, 1.0F)) { + if (e.getAction() == 0) { + this.initialX = e.getX(); + this.initialY = e.getY(); + this.getParent().requestDisallowInterceptTouchEvent(true); + } else if (e.getAction() == 2) { + float dx = e.getX() - this.initialX; + float dy = e.getY() - this.initialY; + boolean isVpHorizontal = orientation == 0; + boolean var8 = false; + float scaledDx = Math.abs(dx) * (isVpHorizontal ? 0.5F : 1.0F); + boolean var9 = false; + float scaledDy = Math.abs(dy) * (isVpHorizontal ? 1.0F : 0.5F); + if (scaledDx > (float) this.touchSlop || scaledDy > (float) this.touchSlop) { + if (isVpHorizontal == scaledDy > scaledDx) { + this.getParent().requestDisallowInterceptTouchEvent(false); + } else if (this.canChildScroll(orientation, isVpHorizontal ? dx : dy)) { + this.getParent().requestDisallowInterceptTouchEvent(true); + } else { + this.getParent().requestDisallowInterceptTouchEvent(false); + } + } + } + + } + } + } + + public NestedScrollableHost(Context context) { + super(context); + ViewConfiguration var10001 = ViewConfiguration.get(this.getContext()); + this.touchSlop = var10001.getScaledTouchSlop(); + } + + public NestedScrollableHost(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + ViewConfiguration var10001 = ViewConfiguration.get(this.getContext()); + this.touchSlop = var10001.getScaledTouchSlop(); + } + + public View _$_findCachedViewById(int var1) { + if (this._$_findViewCache == null) { + this._$_findViewCache = new HashMap(); + } + + View var2 = (View) this._$_findViewCache.get(var1); + if (var2 == null) { + var2 = this.findViewById(var1); + this._$_findViewCache.put(var1, var2); + } + + return var2; + } + + public void _$_clearFindViewByIdCache() { + if (this._$_findViewCache != null) { + this._$_findViewCache.clear(); + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/configs/onRecyclerViewItemClickListener.java b/app/src/main/java/com/example/stlink/configs/onRecyclerViewItemClickListener.java new file mode 100644 index 0000000..55a6776 --- /dev/null +++ b/app/src/main/java/com/example/stlink/configs/onRecyclerViewItemClickListener.java @@ -0,0 +1,10 @@ +package com.example.stlink.configs; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +public interface onRecyclerViewItemClickListener{ + void onItemClick(RecyclerView parent, View view, int position); + void onItemLongClick(RecyclerView parent, View view, int position); +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/fragments/CourseClassListFragment.java b/app/src/main/java/com/example/stlink/fragments/CourseClassListFragment.java new file mode 100644 index 0000000..8a7a5dd --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/CourseClassListFragment.java @@ -0,0 +1,48 @@ +package com.example.stlink.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.example.stlink.R; + +public class CourseClassListFragment extends Fragment { + + private static AppCompatActivity originalActivity; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_course_class_list, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static CourseClassListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + CourseClassListFragment courseClassListFragment = new CourseClassListFragment(); + originalActivity = appCompatActivity; + return courseClassListFragment; + } + + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/CourseIntroMsgFragment.java b/app/src/main/java/com/example/stlink/fragments/CourseIntroMsgFragment.java new file mode 100644 index 0000000..7748f5b --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/CourseIntroMsgFragment.java @@ -0,0 +1,128 @@ +package com.example.stlink.fragments; + +import android.content.Intent; +import android.os.Bundle; +import android.text.method.ScrollingMovementMethod; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.bumptech.glide.Glide; +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.response.data.CourseDetailData; +import com.example.stlink.utils.CommonUtils; + +public class CourseIntroMsgFragment extends Fragment { + + private static AppCompatActivity mAppCompatActivity; + + private static ImageView ivCourseImg; + private static TextView tvCourseDescriptionMsg; + private static TextView tvCourseCreateTimeMsg; + private static TextView tvCourseStartTimeMsg; + private static TextView tvCourseEndTimeMsg; + private static TextView tvCourseStatusMsg; + + private static CourseDetailData courseDetailData; + + private static View mView; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_course_intro_msg, container, false); + initView(view); + mView = view; + return view; + } + + @Override + public void onResume() { + super.onResume(); + + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static CourseIntroMsgFragment newInstance(String str, AppCompatActivity appCompatActivity){ + CourseIntroMsgFragment courseIntroMsgFragment = new CourseIntroMsgFragment(); + mAppCompatActivity = appCompatActivity; + + return courseIntroMsgFragment; + } + + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private static void initView(View view) { + + ivCourseImg = view.findViewById(R.id.iv_course_img); + tvCourseDescriptionMsg = view.findViewById(R.id.tv_course_description_msg); + tvCourseCreateTimeMsg = view.findViewById(R.id.tv_course_create_time_msg); + tvCourseStartTimeMsg = view.findViewById(R.id.tv_course_start_time_msg); + tvCourseEndTimeMsg = view.findViewById(R.id.tv_course_end_time_msg); + tvCourseStatusMsg = view.findViewById(R.id.tv_course_status_msg); + //内容超出文本框大小,支持滑动 + tvCourseDescriptionMsg.setMovementMethod(ScrollingMovementMethod.getInstance()); + } + + /** + * 刷新数据 + * @param intent 携带的数据 + */ + public static void freshData(Intent intent){ + + courseDetailData = (CourseDetailData) intent.getExtras().getSerializable(ModelFieldConstants.COURSE_DETAIL_DATA); + System.out.println("initView: courseDetailData = " + courseDetailData); + + if(courseDetailData == null){ + return; + } + String courseImg = courseDetailData.getCoursePhoto(); + String courseIntro = courseDetailData.getIntroduce(); + Long courseCreateTime = courseDetailData.getCreateTime(); + Long courseStartTime = courseDetailData.getStartTime(); + Long courseEndTime = courseDetailData.getEndTime(); + + if(courseImg != null){ + Glide.with(mAppCompatActivity) + .load(courseImg) + .into(ivCourseImg); + } + if(courseIntro != null){ + tvCourseDescriptionMsg.setText(courseIntro); + } + if(courseCreateTime != null){ + String startFormDate = CommonUtils.stampToDate(String.valueOf(courseCreateTime), "yyyy年MM月dd日"); + tvCourseCreateTimeMsg.setText(startFormDate); + } + if(courseStartTime != null){ + String startFormDate = CommonUtils.stampToDate(String.valueOf(courseStartTime), "yyyy年MM月dd日"); + tvCourseStartTimeMsg.setText(startFormDate); + } + if(courseEndTime != null){ + String startFormDate = CommonUtils.stampToDate(String.valueOf(courseEndTime), "yyyy年MM月dd日"); + tvCourseEndTimeMsg.setText(startFormDate); + } + long currTime = System.currentTimeMillis(); + if(courseEndTime != null && currTime <= courseEndTime){ + tvCourseStatusMsg.setText("未完结"); + }else{ + tvCourseStatusMsg.setText("已完结"); + } + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/CourseSelectedStuFragment.java b/app/src/main/java/com/example/stlink/fragments/CourseSelectedStuFragment.java new file mode 100644 index 0000000..82bc67c --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/CourseSelectedStuFragment.java @@ -0,0 +1,78 @@ +package com.example.stlink.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.Fragment; + +import com.example.stlink.R; + +public class CourseSelectedStuFragment extends Fragment { + + private static AppCompatActivity mAppCompatActivity; + + private ConstraintLayout stu1; + private ConstraintLayout stu2; + private ConstraintLayout stu3; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_course_selected_stu, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static CourseSelectedStuFragment newInstance(String str, AppCompatActivity appCompatActivity){ + CourseSelectedStuFragment courseSelectedStuFragment = new CourseSelectedStuFragment(); + mAppCompatActivity = appCompatActivity; + return courseSelectedStuFragment; + } + + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + stu1 = view.findViewById(R.id.stu_1); + stu2 = view.findViewById(R.id.stu_2); + stu3 = view.findViewById(R.id.stu_3); + setClickListener(); + } + + private void setClickListener(){ + stu1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + stu2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + stu3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } + +} diff --git a/app/src/main/java/com/example/stlink/fragments/CrsFinishedListFragment.java b/app/src/main/java/com/example/stlink/fragments/CrsFinishedListFragment.java new file mode 100644 index 0000000..572cadc --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/CrsFinishedListFragment.java @@ -0,0 +1,192 @@ +package com.example.stlink.fragments; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.activitys.fragmentChild.activityTeaCourse.CourseDetail; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +/** + * 已完成课表 + */ +public class CrsFinishedListFragment extends Fragment { + + private static RecyclerView lvFinishedCourseList; + private static List coursesData; + private static TeaDeleteCourseAdapter adapter; + private static AppCompatActivity mAppCompatActivity; + private static SwipeRefreshLayout srlMyRefresh; + + private int mPage = 1; + private int mCurrentColIndex = 0; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_course_finished, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static CrsFinishedListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + CrsFinishedListFragment unfinishedFra = new CrsFinishedListFragment(); + mAppCompatActivity = appCompatActivity; + return unfinishedFra; + } + + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + + lvFinishedCourseList = view.findViewById(R.id.lv_finished_course_list); + srlMyRefresh = view.findViewById(R.id.srl_my_refresh); + srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00")); + + refreshData(); + + } + + public static void refreshData(){ + + coursesData = new ArrayList<>(); + adapter = new TeaDeleteCourseAdapter( + mAppCompatActivity, + R.layout.card_course_tea, + coursesData, + 1 + ); + LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity); + lvFinishedCourseList.setLayoutManager(llm); + lvFinishedCourseList.setAdapter(adapter); + + bundle = mAppCompatActivity.getIntent().getExtras(); + handler = new Handler(Looper.getMainLooper()){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + CourseData courseData = (CourseData) msg.obj; + coursesData.addAll(courseData.getRecords()); + adapter.notifyDataSetChanged(); + } + }; + getUnfinishedCourseList(); + + setListener(); + } + + /** + * 添加点击事件 + */ + public static void setListener(){ + adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + Intent intent = new Intent(mAppCompatActivity, CourseDetail.class); + bundle = mAppCompatActivity.getIntent().getExtras(); + //将position传入bundle + Long courseId = coursesData.get(position).getmCourseId(); + bundle.putLong(ModelFieldConstants.COURSE_ID, courseId); + System.out.println("courseId == " + courseId); + System.out.println("course == " + coursesData.get(position)); + System.out.println("bundle:courseId == " + bundle.getLong(ModelFieldConstants.COURSE_ID)); + System.out.println("bundle:userId == " + bundle.getLong(ModelFieldConstants.USER_ID)); + intent.putExtras(bundle); + mAppCompatActivity.startActivity(intent); + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { } + }); + srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshData(); + srlMyRefresh.setRefreshing(false); + } + }); + } + + private static void getUnfinishedCourseList(){ + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID); + final String url = UrlConstants.TEACHER_FINISHED + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + System.out.println("courseData = " + courseData); + + if(courseData != null){ + Message message = new Message(); + message.obj = courseData; + handler.sendMessage(message); + }else{ + System.out.println("courseData: null " + "..............................."); + } + } + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + }).start(); + } + +} diff --git a/app/src/main/java/com/example/stlink/fragments/CrsUnfinishedListFragment.java b/app/src/main/java/com/example/stlink/fragments/CrsUnfinishedListFragment.java new file mode 100644 index 0000000..cfd750c --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/CrsUnfinishedListFragment.java @@ -0,0 +1,196 @@ +package com.example.stlink.fragments; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.activitys.fragmentChild.activityTeaCourse.CourseDetail; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +/** + * 未完成课程列表 + */ +public class CrsUnfinishedListFragment extends Fragment { + private static RecyclerView lvUnfinishedCourseList; + private static List coursesData; + private static TeaDeleteCourseAdapter adapter; + private static AppCompatActivity mAppCompatActivity; + private static SwipeRefreshLayout srlMyRefresh; + + private int mPage = 1; + private int mCurrentColIndex = 0; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_course_unfinished, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static CrsUnfinishedListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + CrsUnfinishedListFragment unfinishedFra = new CrsUnfinishedListFragment(); + mAppCompatActivity = appCompatActivity; + return unfinishedFra; + } + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + + lvUnfinishedCourseList = view.findViewById(R.id.lv_unfinished_course_list); + srlMyRefresh = view.findViewById(R.id.srl_my_refresh); + srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00")); + + refreshData(); + + } + + /** + * 刷新数据 + */ + public static void refreshData(){ + + coursesData = new ArrayList<>(); + adapter = new TeaDeleteCourseAdapter( + mAppCompatActivity, + R.layout.card_course_tea, + coursesData, + 0 + ); + LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity); + lvUnfinishedCourseList.setLayoutManager(llm); + lvUnfinishedCourseList.setAdapter(adapter); + + bundle = mAppCompatActivity.getIntent().getExtras(); + handler = new Handler(Looper.getMainLooper()){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + CourseData courseData = (CourseData) msg.obj; + coursesData.addAll(courseData.getRecords()); + adapter.notifyDataSetChanged(); + System.out.println("size == " + adapter.getItemCount() + "................................"); + } + }; + getUnfinishedCourseList(); + + setListener(); + } + + /** + * 添加点击事件 + */ + public static void setListener(){ + adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + Intent intent = new Intent(mAppCompatActivity, CourseDetail.class); + bundle = mAppCompatActivity.getIntent().getExtras(); + //将position传入bundle + Long courseId = coursesData.get(position).getmCourseId(); + bundle.putLong(ModelFieldConstants.COURSE_ID, courseId); + System.out.println("courseId == " + courseId); + System.out.println("course == " + coursesData.get(position)); + System.out.println("bundle:courseId == " + bundle.getLong(ModelFieldConstants.COURSE_ID)); + System.out.println("bundle:userId == " + bundle.getLong(ModelFieldConstants.USER_ID)); + intent.putExtras(bundle); + mAppCompatActivity.startActivity(intent); + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { } + }); + srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshData(); + srlMyRefresh.setRefreshing(false); + } + }); + } + + private static void getUnfinishedCourseList(){ + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID); + final String url = UrlConstants.TEACHER_UNFINISHED + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + System.out.println("courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + System.out.println("courseData = " + courseData); + + if(courseData != null){ + Message message = new Message(); + message.obj = courseData; + handler.sendMessage(message); + }else{ + System.out.println("courseData: null " + "..............................."); + } + } + + @Override + public void failedMethod(BaseResponse baseResponse) { + + } + }.getConnect(url); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/DidNotSignListFragment.java b/app/src/main/java/com/example/stlink/fragments/DidNotSignListFragment.java new file mode 100644 index 0000000..b8f300f --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/DidNotSignListFragment.java @@ -0,0 +1,78 @@ +package com.example.stlink.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter; +import com.example.stlink.model.domain.Course; + +import java.util.List; + +public class DidNotSignListFragment extends Fragment { + private static RecyclerView rvCourseList; + private static List coursesData; + private static TeaDeleteCourseAdapter adapter; + private static AppCompatActivity mAppCompatActivity; + + private int mPage = 1; + private int mCurrentColIndex = 0; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_sign_list, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static DidNotSignListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + DidNotSignListFragment didNotSignListFragment = new DidNotSignListFragment(); + mAppCompatActivity = appCompatActivity; + return didNotSignListFragment; + } + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + + rvCourseList = view.findViewById(R.id.rv_course_list); + + refreshData(); + + } + + /** + * 刷新数据 + */ + public static void refreshData(){ + + + getSignedList(); + } + + + private static void getSignedList(){ + + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/LeaveListFragment.java b/app/src/main/java/com/example/stlink/fragments/LeaveListFragment.java new file mode 100644 index 0000000..d8b4ad0 --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/LeaveListFragment.java @@ -0,0 +1,78 @@ +package com.example.stlink.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter; +import com.example.stlink.model.domain.Course; + +import java.util.List; + +public class LeaveListFragment extends Fragment { + private static RecyclerView rvCourseList; + private static List coursesData; + private static TeaDeleteCourseAdapter adapter; + private static AppCompatActivity mAppCompatActivity; + + private int mPage = 1; + private int mCurrentColIndex = 0; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_sign_list, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static LeaveListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + LeaveListFragment leaveListFragment = new LeaveListFragment(); + mAppCompatActivity = appCompatActivity; + return leaveListFragment; + } + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + + rvCourseList = view.findViewById(R.id.rv_course_list); + + refreshData(); + + } + + /** + * 刷新数据 + */ + public static void refreshData(){ + + + getSignedList(); + } + + + private static void getSignedList(){ + + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/SignListFragment.java b/app/src/main/java/com/example/stlink/fragments/SignListFragment.java new file mode 100644 index 0000000..5cc62b1 --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/SignListFragment.java @@ -0,0 +1,78 @@ +package com.example.stlink.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.TeaDeleteCourseAdapter; +import com.example.stlink.model.domain.Course; + +import java.util.List; + +public class SignListFragment extends Fragment { + private static RecyclerView rvCourseList; + private static List coursesData; + private static TeaDeleteCourseAdapter adapter; + private static AppCompatActivity mAppCompatActivity; + + private int mPage = 1; + private int mCurrentColIndex = 0; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_sign_list, container, false); + initView(view); + return view; + } + + /** + * 堆外暴露的一个方法,用于获取该碎片实例 + * @param str 说明 + * @param appCompatActivity 上下文 + * @return 未结课的碎片实例 + */ + public static SignListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + SignListFragment signListFragment = new SignListFragment(); + mAppCompatActivity = appCompatActivity; + return signListFragment; + } + + /** + * 绑定控件,初始化实例等 + * @param view 当前视图 + */ + private void initView(View view) { + + rvCourseList = view.findViewById(R.id.rv_course_list); + + refreshData(); + + } + + /** + * 刷新数据 + */ + public static void refreshData(){ + + + getSignedList(); + } + + + private static void getSignedList(){ + + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/StuClassListFragment.java b/app/src/main/java/com/example/stlink/fragments/StuClassListFragment.java new file mode 100644 index 0000000..f771044 --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/StuClassListFragment.java @@ -0,0 +1,239 @@ +package com.example.stlink.fragments; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.example.stlink.R; +import com.example.stlink.activitys.fragmentChild.activityStuClassList.CourseSignIn; +import com.example.stlink.configs.adapter.StuClassListFragAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.domain.CourseSign; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +public class StuClassListFragment extends Fragment { + + private static RecyclerView rvStuCourseMsg; + private static List courseSigns; + private static List courseIdList; + private static StuClassListFragAdapter adapter; + private static AppCompatActivity mAppCompatActivity; + private static SwipeRefreshLayout srlMyRefresh; + + private int currentPage = 1; + private int size = 10; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_stu_class_msg, container, false); + initView(view); + return view; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + } + + public static StuClassListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + mAppCompatActivity = appCompatActivity; + StuClassListFragment frag = new StuClassListFragment(); + return frag; + } + + private void initView(View view){ + rvStuCourseMsg = view.findViewById(R.id.rv_stu_course_msg); + srlMyRefresh = view.findViewById(R.id.srl_my_refresh); + srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00")); + refreshData(); + } + + + + public static void refreshData(){ + courseIdList = new ArrayList<>(); + courseSigns = new ArrayList<>(); + adapter = new StuClassListFragAdapter( + mAppCompatActivity, + R.layout.card_class_unsigned_msg, + courseSigns, + 0 + ); + LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity); + rvStuCourseMsg.setLayoutManager(llm); + rvStuCourseMsg.setAdapter(adapter); + + bundle = mAppCompatActivity.getIntent().getExtras(); + + getStuSelectedCourseList(); + //只有在获取当前学生所选课程的所有id之后才能遍历 + handler = new Handler(new Handler.Callback() { + @SuppressLint("NotifyDataSetChanged") + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 100){ + getToBeSignList(); + setListener(); + }else if(msg.arg1 == 200){ + adapter.notifyDataSetChanged(); + System.out.println("StuClassListFragment:courseSigns = " + courseSigns.toString()); + } + return false; + } + }); + + } + + /** + * 为每一项item设置按钮点击监听事件 + */ + private static void setListener(){ + adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() { + + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + CourseSign courseSign = courseSigns.get(position); + bundle.putSerializable(ModelFieldConstants.COURSE_SIGN, courseSign); + Intent intent = new Intent(mAppCompatActivity, CourseSignIn.class); + intent.putExtras(bundle); + mAppCompatActivity.startActivity(intent); + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { + + } + }); + srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshData(); + srlMyRefresh.setRefreshing(false); + } + }); + } + + /** + * 获取学生选择的课程列表 + */ + private static void getStuSelectedCourseList(){ + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID); + final String url = UrlConstants.STUDENT_COURSE + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + System.out.println("StuClassListFragment:baseResponse : " + baseResponse); + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + List records = courseData.getRecords(); + + for(Course course : records){ + courseIdList.add(course.getmCourseId()); + } + + Message message = new Message(); + message.arg1 = 100; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + }).start(); + } + + + /** + * 获取已选课程待签到内容 + */ + private static void getToBeSignList(){ + new Thread(new Runnable() { + @Override + public void run() { + for(Long courseId : courseIdList){ + String urlParam = ModelFieldConstants.COURSE_ID + "=" + courseId + "&" + + ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID) + "&" + + ModelFieldConstants.COURSE_SIGN_STATUS + "=" + 0; + String url = UrlConstants.STUDENT_SIGN_LIST + "?" + urlParam; + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + if(baseResponse.getData() != null){ + System.out.println("StuClassListFragment:courseDataBaseResponse.getData() = " + baseResponse.getData() + "..............."); + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + //array:学生获取所选课程签到列表返回实体 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + for(CourseSign courseSign : courseData.getRecords()){ + courseSign.setCourseId(courseId); + } + + if(courseData.getRecords().size() != 0){ + courseSigns.addAll(courseData.getRecords()); + System.out.println("Here......................"); + Message message = new Message(); + message.arg1 = 200; + handler.sendMessage(message); + } + } + } + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/StuHomeFragment.java b/app/src/main/java/com/example/stlink/fragments/StuHomeFragment.java new file mode 100644 index 0000000..b009179 --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/StuHomeFragment.java @@ -0,0 +1,244 @@ +package com.example.stlink.fragments; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatButton; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.StuDeleteCourseAdapter; +import com.example.stlink.configs.onRecyclerViewItemClickListener; +import com.example.stlink.activitys.fragmentChild.activityStuHome.AllCourses; +import com.example.stlink.activitys.fragmentChild.activityTeaCourse.CourseDetail; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.domain.Course; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.model.response.data.CourseData; +import com.example.stlink.utils.httpUtils.GetUrlParamHttpUtils; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +import gdut.bsx.view.FloatDragPopupWindow; + +public class StuHomeFragment extends Fragment { + + private static FloatingActionButton faButton; + private static AppCompatButton codeButton; + private static AppCompatButton wordButton; + private static RecyclerView rvStuCourseList; + private static ConstraintLayout clFragStuHome; + private static SwipeRefreshLayout srlMyRefresh; + + private static AppCompatActivity mAppCompatActivity; + + private static List courseList; + private static StuDeleteCourseAdapter adapter; + + private static Bundle bundle; + private static Handler handler; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_stu_home, container, false); + mAppCompatActivity = (AppCompatActivity) getActivity(); + initView(view); + return view; + } + + public static StuHomeFragment newInstance(String str){ + StuHomeFragment frag = new StuHomeFragment(); + return frag; + } + + /** + * 初始化布局 + * @param view 当前布局 + */ + private static void initView(View view){ + codeButton = view.findViewById(R.id.bt_code_check); + wordButton = view.findViewById(R.id.bt_word_check); + faButton = view.findViewById(R.id.floating_action_button); + rvStuCourseList = view.findViewById(R.id.rv_stu_course_list); + clFragStuHome = view.findViewById(R.id.cl_frag_stu_home); + srlMyRefresh = view.findViewById(R.id.srl_my_refresh); + srlMyRefresh.setColorSchemeColors(Color.parseColor("#ff0000"),Color.parseColor("#00ff00")); + + + //先把父布局里的该按钮给移除 + clFragStuHome.removeView(faButton); + // 创建 FloatDragPopupWindow,并将 contentView 添加到布局中 + FloatDragPopupWindow floatDragPopupWindow = new FloatDragPopupWindow.Builder(mAppCompatActivity) + .setContentView(faButton) + .setPosition(0, 600) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, AllCourses.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + mAppCompatActivity.startActivity(intent); + } + }) + .build(); + // 显示 FloatDragPopupWindow + floatDragPopupWindow.show(); + + setListener(view); + + refreshData(); + } + + /** + * 为按钮添加点击监听事件 + * @param view 当前布局 + */ + private static void setListener(View view){ + //口令输入 TODO + codeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + //文本输入 TODO + wordButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + faButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + srlMyRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshData(); + srlMyRefresh.setRefreshing(false); + } + }); + } + + + /** + * 刷新数据 + */ + public static void refreshData(){ + courseList = new ArrayList<>(); + adapter = new StuDeleteCourseAdapter( + mAppCompatActivity, + R.layout.card_course_tea, + courseList, + 0 + ); + LinearLayoutManager llm = new LinearLayoutManager(mAppCompatActivity); + rvStuCourseList.setLayoutManager(llm); + rvStuCourseList.setAdapter(adapter); + + bundle = mAppCompatActivity.getIntent().getExtras(); + handler = new Handler(Looper.getMainLooper()){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if(msg.arg1 == 100){ + System.out.println("courseList = " + courseList.toString()); + adapter.notifyDataSetChanged(); + } + } + }; + getStuSelectedCourseList(); + + setItemClickListener(); + } + + /** + * 添加点击事件 + */ + public static void setItemClickListener(){ + adapter.setOnItemClickListener(new onRecyclerViewItemClickListener() { + @Override + public void onItemClick(RecyclerView parent, View view, int position) { + Intent intent = new Intent(mAppCompatActivity, CourseDetail.class); + bundle = mAppCompatActivity.getIntent().getExtras(); + //将position传入bundle + Long courseId = courseList.get(position).getmCourseId(); + bundle.putLong(ModelFieldConstants.COURSE_ID, courseId); + System.out.println("courseId == " + courseId); + System.out.println("course == " + courseList.get(position)); + System.out.println("bundle:courseId == " + bundle.getLong(ModelFieldConstants.COURSE_ID)); + System.out.println("bundle:userId == " + bundle.getLong(ModelFieldConstants.USER_ID)); + intent.putExtras(bundle); + mAppCompatActivity.startActivity(intent); + } + + @Override + public void onItemLongClick(RecyclerView parent, View view, int position) { } + }); + } + + private static void getStuSelectedCourseList(){ + new Thread(new Runnable() { + final String urlParam = ModelFieldConstants.USER_ID + "=" + bundle.getLong(ModelFieldConstants.ID); + final String url = UrlConstants.STUDENT_COURSE + "?" + urlParam; + @Override + public void run() { + new GetUrlParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap courseDataMap = null; + if(obj instanceof LinkedTreeMap){ + courseDataMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到CourseData类中 + String jsonString = gson.toJson(courseDataMap); + CourseData courseData = gson.fromJson(jsonString, new TypeToken>() {}.getType()); + + List records = courseData.getRecords(); + + courseList.addAll(records); + + Message message = new Message(); + message.arg1 = 100; + handler.sendMessage(message); + } + + @Override + public void failedMethod(BaseResponse baseResponse) { } + }.getConnect(url); + } + }).start(); + } + +} diff --git a/app/src/main/java/com/example/stlink/fragments/TeaCourseListFragment.java b/app/src/main/java/com/example/stlink/fragments/TeaCourseListFragment.java new file mode 100644 index 0000000..30fa6ad --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/TeaCourseListFragment.java @@ -0,0 +1,110 @@ +package com.example.stlink.fragments; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.widget.ViewPager2; + +import com.example.stlink.R; +import com.example.stlink.utils.activityUtil.TeaClassListUtil; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; +import java.util.List; + +public class TeaCourseListFragment extends Fragment { + + private static TeaClassListUtil teaClassListUtil; + + private static FloatingActionButton ftBtRefresh; + + private static AppCompatActivity mAppCompatActivity; + private static ViewPager2 viewPager2; + + private static ActivityResultLauncher intentActivityResultLauncher; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_tea_course_list, container, false); + initView(view); + initPage(); + return view; + } + + public static TeaCourseListFragment newInstance(String str, AppCompatActivity appCompatActivity){ + TeaCourseListFragment frag = new TeaCourseListFragment(); + mAppCompatActivity = appCompatActivity; + + intentActivityResultLauncher = appCompatActivity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + int resultCode = result.getResultCode(); + System.out.println("registerForActivityResult..........................."); + if (resultCode == Activity.RESULT_OK) { + + } + }); + return frag; + } + + /** + * 初始化界面 + */ + @SuppressLint("UseCompatLoadingForDrawables") + private void initView(View view){ + + teaClassListUtil = new TeaClassListUtil(view, mAppCompatActivity); + ftBtRefresh = view.findViewById(R.id.ft_bt_refresh); + viewPager2 = view.findViewById(R.id.nav_course_list_fragment); + + refreshData(); + + setClickListener(); + } + + private static void initPage(){ + + List list = new ArrayList<>(); + CrsUnfinishedListFragment crsUnfinishedListFragment = CrsUnfinishedListFragment.newInstance("未结课", mAppCompatActivity); + CrsFinishedListFragment crsFinishedListFragment = CrsFinishedListFragment.newInstance("已结课", mAppCompatActivity); + list.add(crsUnfinishedListFragment); + list.add(crsFinishedListFragment); + teaClassListUtil.initPage(list); + } + + /** + * 刷新数据 + */ + private void refreshData(){ + + } + + /** + * 为当前布局上的按钮添加点击监听事件 + */ + private void setClickListener(){ + //点击刷新页面 + ftBtRefresh.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int position = viewPager2.getCurrentItem(); + if (position == 0){ + CrsUnfinishedListFragment.refreshData(); + }else{ + CrsFinishedListFragment.refreshData(); + } + } + }); + } +} diff --git a/app/src/main/java/com/example/stlink/fragments/TeaHomeFragment.java b/app/src/main/java/com/example/stlink/fragments/TeaHomeFragment.java new file mode 100644 index 0000000..064045f --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/TeaHomeFragment.java @@ -0,0 +1,143 @@ +package com.example.stlink.fragments; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.widget.ViewPager2; + +import com.example.stlink.R; +import com.example.stlink.activitys.fragmentChild.activityTeaHome.CheckCourseSign; +import com.example.stlink.activitys.fragmentChild.activityTeaHome.ChooseCourse; +import com.example.stlink.activitys.fragmentChild.activityTeaHome.CreateCourse; +import com.example.stlink.activitys.fragmentChild.activityTeaHome.CreateSign; +import com.example.stlink.model.constants.ModelFieldConstants; + +public class TeaHomeFragment extends Fragment{ + + private Button btCodeCheck; + private Button btWordCheck; + private Button btCreateClass; + private Button btManageClass; + + private static ViewPager2 vp2; + + private Bundle bundle; + + private static ActivityResultLauncher intentActivityResultLauncher; + + private static AppCompatActivity mAppCompatActivity; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_tea_home, container, false); + initView(view); + return view; + } + + public static TeaHomeFragment newInstance(String str, AppCompatActivity appCompatActivity, ViewPager2 viewPager2){ + mAppCompatActivity = appCompatActivity; + TeaHomeFragment frag = new TeaHomeFragment(); + vp2 = viewPager2; + intentActivityResultLauncher = appCompatActivity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + int resultCode = result.getResultCode(); + + System.out.println("registerForActivityResult..........................."); + if (resultCode == Activity.RESULT_OK) { + //将活动销毁返回的数据刷新到当前活动,同时刷新当前布局 + refreshData(); + }else if (resultCode == 100){ + assert data != null; + mAppCompatActivity.getIntent().putExtras(data.getExtras()); + Intent intent = new Intent(mAppCompatActivity, CheckCourseSign.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + mAppCompatActivity.startActivity(intent); + } + }); + return frag; + } + + /** + * 初始化界面 + */ + private void initView(View view){ + btCodeCheck = view.findViewById(R.id.bt_code_check); + btWordCheck = view.findViewById(R.id.bt_word_check); + btCreateClass = view.findViewById(R.id.bt_create_class); + btManageClass = view.findViewById(R.id.bt_manage_class); + + setClickListener(); + + } + + private static void refreshData(){ + + } + + /** + * 为当前布局上的按钮添加点击监听事件 + */ + private void setClickListener(){ + //查看签到 + btCodeCheck.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bundle = mAppCompatActivity.getIntent().getExtras(); + String nowSignCourseName = bundle.getString(ModelFieldConstants.NOW_SIGN_COURSE_NAME); + if(nowSignCourseName != null){ + System.out.println("nowSignCourseName = " + nowSignCourseName + "......................"); + Intent intent = new Intent(mAppCompatActivity, CheckCourseSign.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + startActivity(intent); + }else{ + Intent intent = new Intent(mAppCompatActivity, ChooseCourse.class); + bundle.putInt(ModelFieldConstants.COURSE_CHOOSE_SELECT, 1); + intent.putExtras(bundle); + startActivity(intent); + } + } + }); + //创建签到 + btWordCheck.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, CreateSign.class); + bundle = mAppCompatActivity.getIntent().getExtras(); + bundle.putInt(ModelFieldConstants.COURSE_CHOOSE_SELECT, 0); + intent.putExtras(bundle); + intentActivityResultLauncher.launch(intent); + } + }); + //创建班级 + btCreateClass.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, CreateCourse.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + } + }); + //管理班级 + btManageClass.setOnClickListener(new View.OnClickListener() { + @SuppressLint("ResourceType") + @Override + public void onClick(View v) { + vp2.setCurrentItem(1); + } + }); + } + +} diff --git a/app/src/main/java/com/example/stlink/fragments/UserInfoFragment.java b/app/src/main/java/com/example/stlink/fragments/UserInfoFragment.java new file mode 100644 index 0000000..081f879 --- /dev/null +++ b/app/src/main/java/com/example/stlink/fragments/UserInfoFragment.java @@ -0,0 +1,230 @@ +package com.example.stlink.fragments; + +import android.app.Activity; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.FileProvider; +import androidx.fragment.app.Fragment; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestOptions; +import com.example.stlink.BuildConfig; +import com.example.stlink.R; +import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoAbout; +import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoDetail; +import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoRecord; +import com.example.stlink.activitys.fragmentChild.activityUserInfo.UserInfoSetting; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.utils.MySQLiteDAO; + +import java.io.File; +import java.util.List; + +public class UserInfoFragment extends Fragment { + + private static Button btSetting; + private static Button btAbout; + private static Button btShare; + private static Button btRecord; + private static ConstraintLayout clBaseInfo; + + private static ImageView ivHeadImg; + private static TextView tvUserName; + private static TextView tvSchool; + + private static AppCompatActivity mAppCompatActivity; + + private static ActivityResultLauncher intentActivityResultLauncher; + + private static Handler shareHandler; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_user_my_info, container, false); + + initView(view); + return view; + } + + /** + * 获取UserInfoFragment实例 + * @param str + * @return 返回UserInfoFragment实例 + */ + public static UserInfoFragment newInstance(String str, AppCompatActivity appCompatActivity){ + UserInfoFragment frag = new UserInfoFragment(); + mAppCompatActivity = appCompatActivity; + intentActivityResultLauncher = mAppCompatActivity.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Intent data = result.getData(); + int resultCode = result.getResultCode(); + System.out.println("registerForActivityResult..........................."); + if (resultCode == Activity.RESULT_OK) { + assert data != null; + mAppCompatActivity.getIntent().putExtras(data.getExtras()); + refreshData(); + } + }); + + return frag; + } + + public static void initView(View view){ + btSetting = view.findViewById(R.id.bt_setting); + btAbout = view.findViewById(R.id.bt_about); + btShare = view.findViewById(R.id.bt_share); + btRecord = view.findViewById(R.id.bt_record); + clBaseInfo = view.findViewById(R.id.base_info); + ivHeadImg = view.findViewById(R.id.iv_head_img); + tvUserName = view.findViewById(R.id.tv_user_name); + tvSchool = view.findViewById(R.id.tv_school); + + MySQLiteDAO mySQLiteDAO = MySQLiteDAO.newInstance(); + + refreshData(); + + initOnClickListener(); + } + + public static void refreshData(){ + + Bundle bundle = mAppCompatActivity.getIntent().getExtras(); + Integer roleId = (Integer) bundle.get(ModelFieldConstants.ROLE_ID); + String userName = (String) bundle.get(ModelFieldConstants.USER_NAME); + String avatar = (String) bundle.get(ModelFieldConstants.AVATAR); + String schoolName = (String) bundle.get(ModelFieldConstants.COLLEGE_NAME); + + if(roleId == 0){ + ivHeadImg.setImageResource(R.mipmap.student); + } + if(avatar != null){ + Glide.with(mAppCompatActivity) + .load(avatar) + //添加圆角 + .apply(new RequestOptions().bitmapTransform(new RoundedCorners(10))) + .into(ivHeadImg); + } + if(userName != null){ + tvUserName.setText(userName); + } + if(schoolName != null){ + tvSchool.setText(schoolName); + } + + } + + public static void initOnClickListener(){ + + btSetting.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, UserInfoSetting.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + } + }); + //关于 + btAbout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, UserInfoAbout.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + } + }); + //分享 + btShare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + shareHandler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message msg) { + if(msg.arg1 == 1){ + Intent shareIntent = (Intent) msg.obj; + intentActivityResultLauncher.launch(Intent.createChooser(shareIntent, "分享apk")); + } + return false; + } + }); + shareApk(); + } + }); + btRecord.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, UserInfoRecord.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + } + }); + clBaseInfo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mAppCompatActivity, UserInfoDetail.class); + intent.putExtras(mAppCompatActivity.getIntent().getExtras()); + intentActivityResultLauncher.launch(intent); + } + }); + } + + private static void shareApk(){ + new Thread(new Runnable() { + @Override + public void run() { + PackageManager mPackageManager = mAppCompatActivity.getPackageManager(); + List packageInfoList = mPackageManager.getInstalledPackages(0); + System.out.println("UserInfoFragment:PackageInfo : " + packageInfoList); + try { + ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo("com.example.stlink", 0); + File apkFile = new File(applicationInfo.sourceDir); + + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); +// // 比如发送文本形式的数据内容 +// // 指定发送的内容 +// shareIntent.putExtra(Intent.EXTRA_TEXT, "S.T.Link......"); +// // 指定发送内容的类型 +// shareIntent.setType("text/plain"); +// +// intentActivityResultLauncher.launch(Intent.createChooser(shareIntent, "分享")); + + shareIntent.setType("*/*"); + // 给目标应用一个临时的读授权,如果要写权限,则是FLAG_GRANT_WRITE_URI_PERMISSION + shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + // 第二个参数就是AndroidManifest中配置的authorities,即包名.fileProvider + Uri contentUri = FileProvider.getUriForFile(mAppCompatActivity, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile); + shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); + + Message message = new Message(); + message.arg1 = 1; + message.obj = shareIntent; + shareHandler.sendMessage(message); + + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/model/constants/ModelFieldConstants.java b/app/src/main/java/com/example/stlink/model/constants/ModelFieldConstants.java new file mode 100644 index 0000000..e3f2431 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/constants/ModelFieldConstants.java @@ -0,0 +1,83 @@ +package com.example.stlink.model.constants; + +public class ModelFieldConstants { + + private ModelFieldConstants(){} + +/*==================================================================================================*/ + // 主键ID + public static final String ID = "id"; + // 角色id 0:学生 1:教师 + public static final String ROLE_ID = "roleId"; + // 学/工号 + public static final String ID_NUMBER = "idNumber"; + // 真实姓名 + public static final String REAL_NAME = "realName"; + // 用户名 + public static final String USER_NAME = "userName"; + //密码 + public static final String PASSWORD = "password"; + //院校名 + public static final String COLLEGE_NAME = "collegeName"; + // 性别, true:男 false:女 默认为男 + public static final String GENDER = "gender"; + // 头像 + public static final String AVATAR = "avatar"; + //邮箱 + public static final String EMAIL = "email"; + //手机号 + public static final String PHONE = "phone"; + //入学时间 + public static final String IN_SCHOOL_TIME = "inSchoolTime"; + //创建时间 + public static final String CREATE_TIME = "createTime"; +/*==================================================================================================*/ + //待修改字段 + public static final String TO_BE_MODIFY = "toBeModify"; +/*==================================================================================================*/ + //文件上传key + public static final String FILE = "file"; +/*==================================================================================================*/ + //课程id + public static final String COURSE_ID = "courseId"; + //课程名 + public static final String COURSE_NAME = "courseName"; + //课程图片 + public static final String COURSE_PHOTO = "coursePhoto"; + //结束时间 + public static final String END_TIME = "endTime"; + //课程介绍 + public static final String INTRODUCE = "introduce"; + //开始时间 + public static final String START_TIME = "startTime"; +/*==================================================================================================*/ + //当前登录用户主键id + public static final String USER_ID = "userId"; + //当前页 + public static final String CURRENT = "current"; + //页面大小 + public static final String SIZE = "size"; +/*==================================================================================================*/ + //选择的课程的position + public static final String COURSE_POSITION = "position"; + //序列化课程 + public static final String COURSE_DETAIL_DATA = "courseDetailData"; + //经纬度 + public static final String LatLon = "latLon"; + //当前签到课程名字 + public static final String NOW_SIGN_COURSE_NAME = "nowSignCourseName"; + //当前签到课程id + public static final String NOW_SIGN_COURSE_ID = "nowSignCourseId"; + //签到状态(0:未签 1:已签)[默认为0,表示未签] + public static final String COURSE_SIGN_STATUS = "status"; + //教师主页课程选择, 0:创建签到 1:查看签到 + public static final String COURSE_CHOOSE_SELECT = "courseChooseSelect"; + //序列化课程签到 + public static final String COURSE_SIGN = "courseSign"; + //地点 + public static final String LOCATION = "location"; +/*==================================================================================================*/ + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/model/constants/SQLiteConstants.java b/app/src/main/java/com/example/stlink/model/constants/SQLiteConstants.java new file mode 100644 index 0000000..09ba0fc --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/constants/SQLiteConstants.java @@ -0,0 +1,35 @@ +package com.example.stlink.model.constants; + +import com.example.stlink.model.contract.UserInfoContract; + +/** + * 本地SQLite相关的SQL语句定义 + */ +public final class SQLiteConstants { + +/*==================================================================================================*/ + public static final String USER_INFO_SQL_CREATE_ENTRIES = + "CREATE TABLE IF NOT EXISTS " + UserInfoContract.UserEntry.TABLE_NAME + " ( " + + UserInfoContract.UserEntry._ID + " INTEGER PRIMARY KEY, " + + UserInfoContract.UserEntry.COLUMN_NAME_APP_KEY + " VARCHAR(256), " + + UserInfoContract.UserEntry.COLUMN_NAME_AVATAR + " VARCHAR(256), " + + UserInfoContract.UserEntry.COLUMN_NAME_COLLEGE_NAME + " VARCHAR(256), " + + UserInfoContract.UserEntry.COLUMN_NAME_CREATE_TIME + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_EMAIL + " VARCHAR(256), " + + UserInfoContract.UserEntry.COLUMN_NAME_GENDER + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_ID + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_ID_NUMBER + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_IN_SCHOOL_TIME + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_LAST_UPDATE_TIME + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_PHONE + " VARCHAR(256), " + + UserInfoContract.UserEntry.COLUMN_NAME_REAL_NAME + " VARCHAR(256), " + + UserInfoContract.UserEntry.COLUMN_NAME_ROLE_ID + " INTEGER, " + + UserInfoContract.UserEntry.COLUMN_NAME_USER_NAME + " VARCHAR(256) " + + ")"; + public static final String USER_INFO_SQL_DELETE_ENTRIES = + "DROP TABLE IF EXISTS " + UserInfoContract.UserEntry.TABLE_NAME; + public static final int DATABASE_FIRST_VERSION = 1; + public static final String USER_INFO_DATABASE_NAME = "userInfo.db"; +/*==================================================================================================*/ + +} diff --git a/app/src/main/java/com/example/stlink/model/constants/UrlConstants.java b/app/src/main/java/com/example/stlink/model/constants/UrlConstants.java new file mode 100644 index 0000000..dded823 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/constants/UrlConstants.java @@ -0,0 +1,96 @@ +package com.example.stlink.model.constants; + +import okhttp3.Credentials; +import okhttp3.MediaType; + +/** + * 存放网络请求相关的静态资源 + */ +public final class UrlConstants { + private UrlConstants(){} + +/*==================================================================================================*/ + //个人身份昵称 + public static final String APP_USER_NAME = "helloWorld"; + //个人身份密码 + public static final String APP_PASSWORD = "HelloWorld,1234"; + //网页登陆之后的token + public static final String TOKEN = "bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTQ2ODM3MTMsInVzZXJfbmFtZSI6IjUiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiMjRhZmQ1MzUtN2EzNy00MjFkLWJiYmEtM2M5ZTQ1ZmIyYzRiIiwiY2xpZW50X2lkIjoiY29pbi1hcGkiLCJzY29wZSI6WyJhbGwiXX0.Hn5ZkEde27mGMkJpY9fOR40wSfI5BDCVRB4tU9AUMnI0jPKFUFkBRqkgcVtjG9HwYWAn-QwtqfpmBwBY5IAf_iIJpfwnXes5bBABUsOGgbNOtSGzTBMhcAtqU-NshuFdPdgBtNvOJkDLx7E2IP3xOPEDTBc9i1eu16IHfyYmRHCE3zRpo2qd1DdP0VuIa_D8JJ7WaEVqFOqS7e1QC7Jfm6eFKAfFPzct6alRiXpoEOq0WLVKdUbD_EjV7GsjT-tmOWGEtKvnZgmhu5Y_LrNhG-iv1lxlEZU3QyDCWs6pVLb03tZe-AIHJl6T-Avjp7uCec3aiOKXjcKgJEDTI-GqYw"; + //身份。。。 + public static final String CREDENTIAL = Credentials.basic(UrlConstants.APP_USER_NAME, UrlConstants.APP_PASSWORD); + //服务器前面公共的地址 + public static final String SERVER_URL = "http://47.107.52.7:88/member/sign"; + //服务器分配的应用ID + public static final String APP_ID = "f39a68c119c34771bfae34a59587ab4e"; + //请求服务器时携带的密码 + public static final String APP_SECRET = "60868270e85186e18489285b5c6e43d50c085"; + //请求头参数 + public static final String HEAD_PARAM = "?" + "&appId=" + UrlConstants.APP_ID + + "&appSecret=" + UrlConstants.APP_SECRET; + // 每次请求结果多少 + public static final Integer PAGE_SIZE = 10; + //媒体请求类型 + public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); + //定义图片文件解析,下面的 * 代表的是要上传的图片的格式,比如:png、jpg、JPEG等等 + public static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*"); + //身份校验 + public static final String AUTHORIZATION = TOKEN; +/*==================================================================================================*/ + public static final String IS_IMG_UPLOAD_SUCCESS = "isImgUploadSuccess"; +/*==================================================================================================*/ + //课程 + public static final String COURSE = "/course"; + //学生 + public static final String STUDENT = "/student"; + //教师 + public static final String TEACHER = "/teacher"; + //用户 + public static final String USER = "/user"; + //用户相关 + public static final String USER_URL = SERVER_URL + USER; + //课程相关 + public static final String COURSE_URL = SERVER_URL + COURSE; + //学生相关 + public static final String STUDENT_URL = COURSE_URL + STUDENT; + //教师相关 + public static final String TEACHER_URL = COURSE_URL + TEACHER; +/*--------------------------------------------------------------------------------------------------*/ + // 用户注册 + public static final String USER_REGISTER = USER_URL + "/register"; + // 用户登录 + public static final String USER_LOGIN = USER_URL + "/login"; + // 修改用户个人信息 + public static final String USER_UPDATE = USER_URL + "/update"; +/*--------------------------------------------------------------------------------------------------*/ + //上传图片 + public static final String FILE_UPLOAD = SERVER_URL + "/image/upload"; +/*--------------------------------------------------------------------------------------------------*/ + // 分页获取全部课程列表 + public static final String ALL_COURSE = COURSE_URL + "/all"; + // 获取单个课程详情 + public static final String COURSE_DETAIL = COURSE_URL + "/detail"; +/*--------------------------------------------------------------------------------------------------*/ + //学生用户获取自己所加入的课程 + public static final String STUDENT_COURSE = STUDENT_URL; + //学生选课 + public static final String STUDENT_SELECT = STUDENT_URL + "/select"; + //学生退课 + public static final String STUDENT_DROP = STUDENT_URL + "/drop"; + //学生签到 + public static final String STUDENT_SIGN = STUDENT_URL + "/sign"; + //学生用户获取所选课程中的签到列表 + public static final String STUDENT_SIGN_LIST = STUDENT_URL + "/signList"; +/*--------------------------------------------------------------------------------------------------*/ + // 教师添加课程POST & 教师删除课程DELETE + public static final String TEACHER_COURSE = TEACHER_URL; + //查看当前教师用户的已经结课的课程列表 + public static final String TEACHER_FINISHED = TEACHER_URL + "/finished"; + //查看当前教师用户的未结课的课程列表 + public static final String TEACHER_UNFINISHED = TEACHER_URL + "/unfinished"; + //教师端发起签到 + public static final String TEACHER_INITIATE = TEACHER_URL + "/initiate"; + //教师获取签到界面数据信息 + public static final String TEACHER_PAGE = TEACHER_URL + "/page"; +/*==================================================================================================*/ + +} diff --git a/app/src/main/java/com/example/stlink/model/contract/UserInfoContract.java b/app/src/main/java/com/example/stlink/model/contract/UserInfoContract.java new file mode 100644 index 0000000..7c044a1 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/contract/UserInfoContract.java @@ -0,0 +1,28 @@ +package com.example.stlink.model.contract; + +import android.provider.BaseColumns; + +/** + * User类的合约类,主要是对数据库的字段进行定义 + */ +public final class UserInfoContract { + private UserInfoContract(){} + + public static class UserEntry implements BaseColumns { + public static final String TABLE_NAME = "user_info"; + public static final String COLUMN_NAME_APP_KEY = "appKey"; + public static final String COLUMN_NAME_AVATAR = "avatar"; + public static final String COLUMN_NAME_COLLEGE_NAME = "collegeName"; + public static final String COLUMN_NAME_CREATE_TIME = "createTime"; + public static final String COLUMN_NAME_EMAIL = "email"; + public static final String COLUMN_NAME_GENDER = "gender"; + public static final String COLUMN_NAME_ID = "id"; + public static final String COLUMN_NAME_ID_NUMBER = "idNumber"; + public static final String COLUMN_NAME_IN_SCHOOL_TIME = "inSchoolTime"; + public static final String COLUMN_NAME_LAST_UPDATE_TIME = "lastUpdateTime"; + public static final String COLUMN_NAME_PHONE = "phone"; + public static final String COLUMN_NAME_REAL_NAME = "realName"; + public static final String COLUMN_NAME_ROLE_ID = "roleId"; + public static final String COLUMN_NAME_USER_NAME= "userName"; + } +} diff --git a/app/src/main/java/com/example/stlink/model/domain/Course.java b/app/src/main/java/com/example/stlink/model/domain/Course.java new file mode 100644 index 0000000..f2aecb5 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/domain/Course.java @@ -0,0 +1,72 @@ +package com.example.stlink.model.domain; + +import com.google.gson.annotations.SerializedName; + +public class Course { + + /** + * 院校名 + */ + @SerializedName("collegeName") + private String mCollegeName; + + /** + * 课程表主键 + */ + @SerializedName("courseId") + private Long mCourseId; + + /** + * 课程名 + */ + @SerializedName("courseName") + private String mCourseName; + + /** + * 课程图片 + */ + @SerializedName("coursePhoto") + private String mCoursePhoto; + + public String getmCollegeName() { + return mCollegeName; + } + + public void setmCollegeName(String mCollegeName) { + this.mCollegeName = mCollegeName; + } + + public Long getmCourseId() { + return mCourseId; + } + + public void setmCourseId(Long mCourseId) { + this.mCourseId = mCourseId; + } + + public String getmCourseName() { + return mCourseName; + } + + public void setmCourseName(String mCourseName) { + this.mCourseName = mCourseName; + } + + public String getmCoursePhoto() { + return mCoursePhoto; + } + + public void setmCoursePhoto(String mCoursePhoto) { + this.mCoursePhoto = mCoursePhoto; + } + + @Override + public String toString() { + return "Course{" + + "mCollegeName='" + mCollegeName + '\'' + + ", mCourseId=" + mCourseId + + ", mCourseName='" + mCourseName + '\'' + + ", mCoursePhoto='" + mCoursePhoto + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/domain/CourseSign.java b/app/src/main/java/com/example/stlink/model/domain/CourseSign.java new file mode 100644 index 0000000..df9eae4 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/domain/CourseSign.java @@ -0,0 +1,81 @@ +package com.example.stlink.model.domain; + +import java.io.Serializable; + +public class CourseSign implements Serializable { + + /** + * 上课地点 + */ + private String courseAddr; + + /** + * 课程名 + */ + private String courseName; + + /** + * 课程id + */ + private Long courseId; + + /** + * 创建时间 + */ + private Long createTime; + + /** + * 主键id + */ + private Long userSignId; + + public String getCourseAddr() { + return courseAddr; + } + + public void setCourseAddr(String courseAddr) { + this.courseAddr = courseAddr; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + public Long getUserSignId() { + return userSignId; + } + + public void setUserSignId(Long userSignId) { + this.userSignId = userSignId; + } + + public Long getCourseId() { + return courseId; + } + + public void setCourseId(Long courseId) { + this.courseId = courseId; + } + + @Override + public String toString() { + return "CourseSign{" + + "courseAddr='" + courseAddr + '\'' + + ", courseName='" + courseName + '\'' + + ", createTime=" + createTime + + ", userSignId=" + userSignId + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/domain/User.java b/app/src/main/java/com/example/stlink/model/domain/User.java new file mode 100644 index 0000000..a35efa9 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/domain/User.java @@ -0,0 +1,182 @@ +package com.example.stlink.model.domain; + +import android.content.Intent; + +import java.util.Date; + +public class User { + + //用户所创建应用的id + private String appKey; + + //头像 + private String avatar; + + //院校名 + private String collegeName; + + //创建时间 + private Long createTime; + + //邮箱 + private String email; + + //性别 + private Boolean gender; + + //主键id + private Long id; + + //学/工号 + private Long idNumber; + + //入学时间 + private Long inSchoolTime; + + //上次修改时间 + private Long lastUpdateTime; + + //手机号 + private String phone; + + //真实姓名 + private String realName; + + //角色【0:学生,1:教师】 + private Integer roleId; + + //用户名 + private String userName; + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getCollegeName() { + return collegeName; + } + + public void setCollegeName(String collegeName) { + this.collegeName = collegeName; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Boolean getGender() { + 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 Long getInSchoolTime() { + return inSchoolTime; + } + + public void setInSchoolTime(Long inSchoolTime) { + this.inSchoolTime = inSchoolTime; + } + + public Long getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(Long lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } + + 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 Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "User{" + + "appKey='" + appKey + '\'' + + ", avatar='" + avatar + '\'' + + ", collegeName='" + collegeName + '\'' + + ", createTime=" + createTime + + ", email='" + email + '\'' + + ", gender=" + gender + + ", id=" + id + + ", idNumber=" + idNumber + + ", inSchoolTime=" + inSchoolTime + + ", lastUpdateTime=" + lastUpdateTime + + ", phone='" + phone + '\'' + + ", realName='" + realName + '\'' + + ", roleId=" + roleId + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/request/AllCourseRequest.java b/app/src/main/java/com/example/stlink/model/request/AllCourseRequest.java new file mode 100644 index 0000000..8f3ce73 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/request/AllCourseRequest.java @@ -0,0 +1,36 @@ +package com.example.stlink.model.request; + +import com.example.stlink.model.constants.UrlConstants; + +public class AllCourseRequest { + + private Integer current; + + private Integer size; + + public Integer getCurrent() { + return current; + } + + public void setCurrent(Integer current) { + this.current = current; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + @Override + public String toString() { + String retValue; + retValue = "?" + "&appId=" + UrlConstants.APP_ID + + "&appSecret=" + UrlConstants.APP_SECRET + + "¤t" + current + + "&size" + size; + return retValue; + } +} diff --git a/app/src/main/java/com/example/stlink/model/request/CourseCreateRequest.java b/app/src/main/java/com/example/stlink/model/request/CourseCreateRequest.java new file mode 100644 index 0000000..d817b2f --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/request/CourseCreateRequest.java @@ -0,0 +1,141 @@ +package com.example.stlink.model.request; + +import com.google.gson.internal.bind.util.ISO8601Utils; + +public class CourseCreateRequest { + + /** + * 院校名 + */ + private String collegeName; + + /** + * 课程名 + */ + private String courseName; + + /** + * 课程的资源图片链接【需要先上传图片获取链接】 + */ + private String coursePhoto; + + /** + * 课程结束时间(时间戳) + */ + private Long endTime; + + /** + * 课程简介 + */ + private String introduce; + + /** + * + * 当前登录真实姓名 + */ + private String realName; + + /** + * + * 课程开始时间(时间戳) + */ + private Long startTime; + + /** + * 当前登录用户id + */ + 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 introduce) { + this.introduce = introduce; + } + + 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; + } + + @Override + public String toString() { + return "CourseCreateRequest{" + + "collegeName='" + collegeName + '\'' + + ", courseName='" + courseName + '\'' + + ", coursePhoto='" + coursePhoto + '\'' + + ", endTime=" + endTime + + ", introduce='" + introduce + '\'' + + ", realName='" + realName + '\'' + + ", startTime=" + startTime + + ", userId=" + userId + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/request/CourseCreateSignRequest.java b/app/src/main/java/com/example/stlink/model/request/CourseCreateSignRequest.java new file mode 100644 index 0000000..ee5c8ba --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/request/CourseCreateSignRequest.java @@ -0,0 +1,125 @@ +package com.example.stlink.model.request; + +/** + * 创建课程签到请求类 + */ +public class CourseCreateSignRequest { + + /** + * 签到开始时间(时间戳,精确到毫秒) + */ + private Long beginTime; + + /** + * 上课地点 + */ + private String courseAddr; + + /** + * 课程的主键id【可前往未结课的科恒列表获取】 + */ + private Long courseId; + + /** + * 课程名 + */ + private String courseName; + + /** + * 签到结束时间(时间戳,精确到毫秒) + */ + private Long endTime; + + /** + * 签到码 + */ + private Long signCode; + + /** + * 选课人数 + */ + private Long total; + + /** + * 发起签到的用户id + */ + private Long userId; + + public Long getBeginTime() { + return beginTime; + } + + public void setBeginTime(Long beginTime) { + this.beginTime = beginTime; + } + + public String getCourseAddr() { + return courseAddr; + } + + public void setCourseAddr(String courseAddr) { + this.courseAddr = courseAddr; + } + + public Long getCourseId() { + return courseId; + } + + public void setCourseId(Long courseId) { + this.courseId = courseId; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + + public Long getSignCode() { + return signCode; + } + + public void setSignCode(Long signCode) { + this.signCode = signCode; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "CourseCreateSignRequest{" + + "beginTime=" + beginTime + + ", courseAddr='" + courseAddr + '\'' + + ", courseId=" + courseId + + ", courseName='" + courseName + '\'' + + ", endTime=" + endTime + + ", signCode=" + signCode + + ", total=" + total + + ", userId=" + userId + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/request/StuSignRequest.java b/app/src/main/java/com/example/stlink/model/request/StuSignRequest.java new file mode 100644 index 0000000..b6af801 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/request/StuSignRequest.java @@ -0,0 +1,54 @@ +package com.example.stlink.model.request; + +import android.content.Intent; + +public class StuSignRequest { + + /** + * 签到码 + */ + private Integer signCode; + + /** + * 当钱登录用户的主键id + */ + private Long userId; + + /** + * 学生获取到的签到表主键id + */ + private Long userSignId; + + public Integer getSignCode() { + return signCode; + } + + public void setSignCode(Integer signCode) { + this.signCode = signCode; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getUserSignId() { + return userSignId; + } + + public void setUserSignId(Long userSignId) { + this.userSignId = userSignId; + } + + @Override + public String toString() { + return "StuSignRequest{" + + "signCode=" + signCode + + ", userId=" + userId + + ", userSignId=" + userSignId + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/request/UserModifyRequest.java b/app/src/main/java/com/example/stlink/model/request/UserModifyRequest.java new file mode 100644 index 0000000..2e2fdaf --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/request/UserModifyRequest.java @@ -0,0 +1,151 @@ +package com.example.stlink.model.request; + +public class UserModifyRequest { + + /** + * 主键id + */ + private Long id; + + /** + * 头像(网络资源图片链接) + */ + private String avatar; + + /** + * 院校名 + */ + private String collegeName; + + /** + * 邮箱 + */ + private String email; + + /** + * 性别true:男,默认true + */ + private Boolean gender; + + /** + * 学/工号 + */ + private Long idNumber; + + /** + * 入学时间(时间戳) + */ + private Long inSchoolTime; + + /** + * + * 手机号 + */ + private String phone; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 用户名 + */ + private String userName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + 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 getGender() { + return gender; + } + + public void setGender(Boolean gender) { + this.gender = gender; + } + + public Long getIdNumber() { + return idNumber; + } + + public void setIdNumber(Long idNumber) { + this.idNumber = idNumber; + } + + public Long getInSchoolTime() { + return inSchoolTime; + } + + public void setInSchoolTime(Long inSchoolTime) { + this.inSchoolTime = inSchoolTime; + } + + 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; + } + + @Override + public String toString() { + return "UserModifyRequest{" + + "id=" + id + + ", avatar='" + avatar + '\'' + + ", collegeName='" + collegeName + '\'' + + ", email='" + email + '\'' + + ", gender=" + gender + + ", idNumber=" + idNumber + + ", inSchoolTime=" + inSchoolTime + + ", phone='" + phone + '\'' + + ", realName='" + realName + '\'' + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/request/UserRegisterRequest.java b/app/src/main/java/com/example/stlink/model/request/UserRegisterRequest.java new file mode 100644 index 0000000..352f1a9 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/request/UserRegisterRequest.java @@ -0,0 +1,52 @@ +package com.example.stlink.model.request; + +public class UserRegisterRequest { + + /** + * 密码 + */ + private String password; + + /** + * 角色 + */ + private Integer roleId; + + /** + * 用户名 + */ + private String userName; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "UserRegisterRequest{" + + "password='" + password + '\'' + + ", roleId=" + roleId + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/response/BaseResponse.java b/app/src/main/java/com/example/stlink/model/response/BaseResponse.java new file mode 100644 index 0000000..b8e7393 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/response/BaseResponse.java @@ -0,0 +1,45 @@ +package com.example.stlink.model.response; + +public class BaseResponse { + + private int code; + private String msg; + private T data; + + public final static int RESPONSE_SUCCESS = 0; + + public BaseResponse(){} + + 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; + } + + @Override + public String toString() { + return "BaseResponse{" + + "code=" + code + + ", msg='" + msg + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/response/data/CourseData.java b/app/src/main/java/com/example/stlink/model/response/data/CourseData.java new file mode 100644 index 0000000..27d4531 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/response/data/CourseData.java @@ -0,0 +1,60 @@ +package com.example.stlink.model.response.data; + +import com.example.stlink.model.domain.Course; + +import java.util.Arrays; +import java.util.List; + +public class CourseData { + + private Integer current; + + private List records; + + private Integer size; + + private Integer total; + + public Integer getCurrent() { + return current; + } + + public void setCurrent(Integer current) { + this.current = current; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + @Override + public String toString() { + return "CourseData{" + + "current=" + current + + ", records=" + records + + ", size=" + size + + ", total=" + total + + '}'; + } + +} diff --git a/app/src/main/java/com/example/stlink/model/response/data/CourseDetailData.java b/app/src/main/java/com/example/stlink/model/response/data/CourseDetailData.java new file mode 100644 index 0000000..20c43cd --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/response/data/CourseDetailData.java @@ -0,0 +1,170 @@ +package com.example.stlink.model.response.data; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class CourseDetailData implements Serializable { + + /** + * 院校名 + */ + private String collegeName; + + /** + * 课程名 + */ + private String courseName; + + /** + * 课程图片 + */ + private String coursePhoto; + + /** + * 创建时间 + */ + private Long createTime; + + /** + * 课程结束时间(时间戳) + */ + private Long endTime; + + /** + * + * 是否已选择当前课程 + */ + private Boolean hasSelect; + + /** + * + * 主键id + */ + private Long id; + + /** + * 课程简介 + */ + private String introduce; + + /** + * 创建者的真实姓名 + */ + private String realName; + + /** + * 课程开始时间(时间戳) + */ + private Long startTime; + + /** + * 创建人的用户名 + */ + 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 getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + + public Boolean getHasSelect() { + return hasSelect; + } + + public void setHasSelect(Boolean hasSelect) { + this.hasSelect = hasSelect; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getIntroduce() { + return introduce; + } + + public void setIntroduce(String introduce) { + this.introduce = introduce; + } + + 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 String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "CourseDetailData{" + + "collegeName='" + collegeName + '\'' + + ", courseName='" + courseName + '\'' + + ", coursePhoto='" + coursePhoto + '\'' + + ", createTime=" + createTime + + ", endTime=" + endTime + + ", hasSelect=" + hasSelect + + ", id=" + id + + ", introduce='" + introduce + '\'' + + ", realName='" + realName + '\'' + + ", startTime=" + startTime + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/model/response/data/CourseSignMsg.java b/app/src/main/java/com/example/stlink/model/response/data/CourseSignMsg.java new file mode 100644 index 0000000..fa06459 --- /dev/null +++ b/app/src/main/java/com/example/stlink/model/response/data/CourseSignMsg.java @@ -0,0 +1,52 @@ +package com.example.stlink.model.response.data; + +public class CourseSignMsg { + + /** + * 课程主键Id + */ + private Long courseId; + + /** + * 课程名 + */ + private String courseName; + + /** + * 当前课程已选课人数 + */ + private Long courseNum; + + public Long getCourseId() { + return courseId; + } + + public void setCourseId(Long courseId) { + this.courseId = courseId; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public Long getCourseNum() { + return courseNum; + } + + public void setCourseNum(Long courseNum) { + this.courseNum = courseNum; + } + + @Override + public String toString() { + return "CourseSignMsg{" + + "courseId=" + courseId + + ", courseName='" + courseName + '\'' + + ", courseNum=" + courseNum + + '}'; + } +} diff --git a/app/src/main/java/com/example/stlink/utils/CommonUtils.java b/app/src/main/java/com/example/stlink/utils/CommonUtils.java new file mode 100644 index 0000000..be9ed0a --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/CommonUtils.java @@ -0,0 +1,303 @@ +package com.example.stlink.utils; + +import android.annotation.SuppressLint; +import android.app.ActivityManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Build; +import android.text.TextUtils; +import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.R; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +/** + * 一些公共方法 + */ +public class CommonUtils { + + /** + * 加密/解密密钥 + */ + private final static char secret = 'Z'; + + /** + * 简单的异或运算进行加密和解密 + * @param value 值 + * @return 加密后数据 + */ + public static String encryptAndDencrypt(String value) { + byte[] bt = value.getBytes(); // 将需要加密的内容转换为字节数组 + for (int i = 0; i < bt.length; i++) { + bt[i] = (byte) (bt[i] ^ (int) secret); // 通过异或运算进行加密 + } + return new String(bt, 0, bt.length); + } + + /** + * MD5加密方法 + * @param data 待加密数据 + * @return 加密后数据 + */ + public static String MD5(String data) { + try { + java.security.MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(data.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + } catch (Exception exception) { + exception.printStackTrace(); + } + return null; + } + + + /** + * 密码保存到本地 + * @param appCompatActivity 上下文 + * @param password 密码 + * @param account 账户 + * @param isChecked 是否保存 + */ + public static void localSave(AppCompatActivity appCompatActivity, String account, String password, Boolean isChecked){ + String spFileName = appCompatActivity.getResources() + .getString(R.string.shared_preferences_file_name); + String accountKey = appCompatActivity.getResources() + .getString(R.string.login_account_name); + String passwordKey = appCompatActivity.getResources() + .getString(R.string.login_password); + String rememberPasswordKey = appCompatActivity.getResources() + .getString(R.string.login_remember_password); + + SharedPreferences spFile = appCompatActivity.getSharedPreferences( + spFileName, + Context.MODE_PRIVATE + ); + SharedPreferences.Editor editor = spFile.edit(); + + if(isChecked){ + editor.putString(accountKey, account); + editor.putString(passwordKey, encryptAndDencrypt(password)); + editor.putBoolean(rememberPasswordKey, true); + editor.apply(); + }else{ + editor.remove(accountKey); + editor.remove(passwordKey); + editor.remove(rememberPasswordKey); + editor.apply(); + } + } + + /** + * 实现状态栏文字颜色为暗色 + * @param appCompatActivity 上下文 + */ + public static void changeStatusBar(AppCompatActivity appCompatActivity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + appCompatActivity.getWindow() + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + } + + /** + * 销毁任务栈 + * 直接调用系统 API获取当前的任务栈,把里面的Activity全部销毁掉。 + * 不过该方法简单粗暴,需要 API 21(Android 5.0)以上才可以使用。 + * @param context 上下文 + */ + public static void exitApp(Context context){ + ActivityManager activityManager = (ActivityManager) context.getApplicationContext() + .getSystemService(Context.ACTIVITY_SERVICE); + List appTaskList = activityManager.getAppTasks(); + for (ActivityManager.AppTask appTask : appTaskList) { + appTask.finishAndRemoveTask(); + } + } + + + /** + * 先根据注册规则进行初次校验 + * @param id 账户 + * @param pwd 密码 + * @return 校验结果 + */ + public static Boolean localCheck(String id, String pwd){ + + return isLegalId(id) && isLegalPwd(pwd); + + } + + /** + * @param pwd 密码 + * @return 是否成功 + */ + public static Boolean pwdCheck(String pwd){ + // MD5后的密码传输到云端,与数据库中的密码进行校验 + CommonUtils.MD5(pwd); + return true; + } + + + /** + * 以下情形id不合法 + * 1、为空 + * 2、字符串长度小于6,或者大于32 + * 3、第一个字符为非字母字符 + * 4、id中包含非数字,字母,还有下划线存在 + * 3、包括一种隐形标准,数据库中已经存在该用户 + * @param id id + * @return 是否合法 + */ + public static boolean isLegalId(String id){ + + int len = id.length(); + if(TextUtils.isEmpty(id) || len < 6 || len > 32){ + return false; + } else { + char firstCh = id.charAt(0); + if( (firstCh >= 'a' && firstCh <= 'z') || (firstCh >= 'A' && firstCh <= 'Z')){ + for(int i = 1; i < len; i++){ + char nowCh = id.charAt(i); + if( !(nowCh == '_' || + (nowCh >= 'a' && nowCh <= 'z') || + (nowCh >= 'A' && nowCh <= 'Z') || + (nowCh >= '0' && nowCh <= '9')) ){ + return false; + } + } + return true; + }else{ + return false; + } + } + } + + /** + * 以下情形密码不合法 + * 1、密码长度为空 + * 2、包含空格 + * @param pwd 密码 + * @return 是否合法 + */ + public static boolean isLegalPwd(String pwd){ + + int len = pwd.length(); + if(len == 0){ + return false; + } + for (int i = 0; i < len; i++){ + if(pwd.charAt(i) == ' '){ + return false; + } + } + return true; + } + + /** + * 检验两次输入密码是否相同 + * @param pwdFirst 第一次密码 + * @param pwdSecond 第二次密码 + * @return 校验结果 + */ + public static boolean isSamePwd(String pwdFirst, String pwdSecond){ + + int lenFirst = pwdFirst.length(); + int lenSecond = pwdSecond.length(); + if(lenFirst != lenSecond){ + return false; + } + for(int i = 0; i < lenFirst; i++){ + if(pwdFirst.charAt(i) != pwdSecond.charAt(i)){ + return false; + } + } + return true; + } + + + /** + * 将时间戳转换为时间 + * @param s 时间戳 + * @return 返回yyyy-MM-dd HH:mm:ss格式的字符串 + */ + public static String stampToDate(String s) { + String res; + @SuppressLint("SimpleDateFormat") + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + //需要加八个格林威治时间 + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); + //如果它本来就是long类型的,则不用写这一步 + long lt = new Long(s); + Date date = new Date(lt); + res = simpleDateFormat.format(date); + return res; + } + + /** + * 将时间戳转换为时间 + * @param s 时间戳 + * @param fprmat 指定格式 + * @return 指定格式的字符串 + */ + public static String stampToDate(String s, String fprmat) { + String res; + @SuppressLint("SimpleDateFormat") + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(fprmat); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); + //如果它本来就是long类型的,则不用写这一步 + long lt = Long.parseLong(s); + Date date = new Date(lt); + res = simpleDateFormat.format(date); + return res; + } + + /** + * 将时间转换为时间戳 + * @param s 时间 + * @return 时间戳 + * @throws ParseException 解析异常 + */ + @SuppressLint("SimpleDateFormat") + public static String dateToStamp(String s, String fprmat) throws ParseException { + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(fprmat); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); + Date date = simpleDateFormat.parse(s); + assert date != null; + long ts = date.getTime(); + res = String.valueOf(ts); + return res; + } + + /** + * 将时间转换为时间戳 + * @param s 时间 + * @return 时间戳 + * @throws ParseException 解析异常 + */ + @SuppressLint("SimpleDateFormat") + public static String dateToStamp(String s) throws ParseException { + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); + Date date = simpleDateFormat.parse(s); + assert date != null; + long ts = date.getTime(); + res = String.valueOf(ts); + return res; + } +} diff --git a/app/src/main/java/com/example/stlink/utils/MyLocationListener.java b/app/src/main/java/com/example/stlink/utils/MyLocationListener.java new file mode 100644 index 0000000..f30de2b --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/MyLocationListener.java @@ -0,0 +1,85 @@ +package com.example.stlink.utils; + +import android.os.Handler; +import android.os.Message; +import android.widget.TextView; + +import com.baidu.location.BDAbstractLocationListener; +import com.baidu.location.BDLocation; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.BitmapDescriptorFactory; +import com.baidu.mapapi.map.MapStatusUpdateFactory; +import com.baidu.mapapi.map.MapView; +import com.baidu.mapapi.map.MyLocationConfiguration; +import com.baidu.mapapi.map.MyLocationData; +import com.baidu.mapapi.model.LatLng; +import com.example.stlink.R; + + +// 继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView +public class MyLocationListener extends BDAbstractLocationListener { + + private MapView mMapView; + private BaiduMap mBaiduMap; + private Handler handler; + + private BDLocation retLocation; + + // 是否是第一次定位 + public static boolean isFirstLocate = true; + // 当前定位模式 + private MyLocationConfiguration.LocationMode locationMode; + + public MyLocationListener(MapView mMapView, BaiduMap mBaiduMap, Handler handler){ + this.mMapView = mMapView; + this.mBaiduMap = mBaiduMap; + this.handler = handler; + } + + @Override + public void onReceiveLocation(BDLocation location) { + + retLocation = location; + + //mapView 销毁后不在处理新接收的位置 + if (location == null || mMapView == null){ + return; + } + LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); +// //如果是第一次定位 +// if (isFirstLocate) { +// isFirstLocate = false; + //给地图设置状态 + mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(ll)); +// } + + MyLocationData locData = new MyLocationData.Builder() + .accuracy(location.getRadius()) + // 此处设置开发者获取到的方向信息,顺时针0-360 + .direction(location.getDirection()).latitude(location.getLatitude()) + .longitude(location.getLongitude()).build(); + mBaiduMap.setMyLocationData(locData); + + // ------------------ 以下是可选部分 ------------------ + // 自定义地图样式,可选 + // 更换定位图标,这里的图片是放在 mipmap 文件下的 + BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.location); + // 定位模式 地图SDK支持三种定位模式:NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态) + locationMode = MyLocationConfiguration.LocationMode.NORMAL; + // 定位模式、是否开启方向、设置自定义定位图标、精度圈填充颜色以及精度圈边框颜色5个属性(此处只设置了前三个)。 + MyLocationConfiguration mLocationConfiguration = new MyLocationConfiguration(locationMode,true,mCurrentMarker); + // 使自定义的配置生效 + mBaiduMap.setMyLocationConfiguration(mLocationConfiguration); + // ------------------ 可选部分结束 ------------------ + + Message msg = new Message(); + msg.arg1 = 200; + handler.sendMessage(msg); + } + + public BDLocation getLocation(){ + return retLocation; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/utils/MySQLiteDAO.java b/app/src/main/java/com/example/stlink/utils/MySQLiteDAO.java new file mode 100644 index 0000000..b701c1a --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/MySQLiteDAO.java @@ -0,0 +1,272 @@ +package com.example.stlink.utils; + +import android.annotation.SuppressLint; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import androidx.annotation.Nullable; + +import com.example.stlink.configs.MySQLiteOpenHelper; + +/** + * 封装专门操作SQLite的工具类 + */ +public class MySQLiteDAO { + + private static MySQLiteDAO mySQLiteDAO = null; + + private static MySQLiteOpenHelper mySQLiteOpenHelper = null; + + private MySQLiteDAO(){} + + /** + * 懒汉式单例模式 + * 使用双重校验锁 + * 获取当前工具类的实例 + * @return 返回数据库操作类的实例 + */ + public static MySQLiteDAO newInstance(){ + if(mySQLiteDAO == null){ + synchronized (MySQLiteDAO.class){ + if(mySQLiteDAO == null){ + mySQLiteDAO = new MySQLiteDAO(); + } + } + } + return mySQLiteDAO; + } + + /** + * 建表 + * @param context 上下文 + * @param dbName 数据库名字 + * @param factory SQLiteDatabase.CursorFactory + * @param version 版本 + * @param sqlCreateEntries 创建数据库的语句 + * @param sqlDeleteEntries 删除数据库的语句 + * @return 表是否创建成功 + */ + public boolean createTable(@Nullable Context context, + @Nullable String dbName, + @Nullable SQLiteDatabase.CursorFactory factory, + int version, + @Nullable String sqlCreateEntries, + @Nullable String sqlDeleteEntries){ + if(mySQLiteDAO != null){ + //建表 + mySQLiteOpenHelper = new MySQLiteOpenHelper( + context, + dbName, + null, + version, + sqlCreateEntries, + sqlDeleteEntries + ); + return true; + } + return false; + } + + /** + * 插入一条新的数据 + * @param tableName 表名 + * @param nullColumnHack 为null字段的默认值 + * @param values 需要插入的ContentValues值 + * @return 插入数据的所在的行号 + */ + public boolean insertValue(@Nullable String tableName, + @Nullable String nullColumnHack, + @Nullable ContentValues values){ + SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase(); + db.beginTransaction(); + long rows = db.insertOrThrow(tableName, nullColumnHack, values); + //SQLite不支持多线程同时有多个对数据库进行写操作,所以需要每次写操作结束后关闭事务和写操作 + db.setTransactionSuccessful(); + db.endTransaction(); + db.close(); + return rows != -1; + } + + /** + * 根据查询条件删除指定列 + * @param tableName 表名 + * @param whereClause 查询条件 使用 id=?形式,可用?占位符 + * @param whereArgs 当表达式中含有占位符,改参数用户指定各占位符参数的值 + * @return 是否删除成功 + */ + public boolean deleteValue(@Nullable String tableName, + @Nullable String whereClause, + @Nullable String[] whereArgs){ + SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase(); + db.beginTransaction(); + long rows = db.delete(tableName, + whereClause, + whereArgs); + db.endTransaction(); + db.close(); + return rows != -1; + } + + /** + * 根据查询条件更新指定列 + * @param tableName 表名 + * @param values 指定要更新的字段及对应的字段值 + * @param whereClause 查询条件 使用 id=?形式,可用?占位符 + * @param whereArgs 当表达式中含有占位符,改参数用户指定各占位符参数的值 + * @return 是否更新成功 + */ + public boolean updateValue(@Nullable String tableName, + @Nullable ContentValues values, + @Nullable String whereClause, + @Nullable String[] whereArgs){ + SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase(); + db.beginTransaction(); + long rows = db.update(tableName, + values, + whereClause, + whereArgs); + db.endTransaction(); + db.close(); + return rows != -1; + } + + /** + * 查询数据库,返回游标cursor,注意需要主程序进行关闭 + * @param tableName 表名 + * @param columns 指定要查询的列,如果为空,返回所有 + * @param selection 查询条件 使用 id=?形式,可用?占位符 + * @param selectionArgs where对应的条件值 + * @param groupBy 指定分组方式 + * @param having 指定having条件 + * @param orderBy 排序方式 + * @return 返回游标cursor + */ + public Cursor queryValuesCursor(@Nullable String tableName, + String[] columns, + @Nullable String selection, + @Nullable String[] selectionArgs, + @Nullable String groupBy, + @Nullable String having, + @Nullable String orderBy){ + SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase(); + //创建游标对象 + Cursor cursor = db.query(tableName, + columns, + selection, + selectionArgs, + groupBy, + having, + orderBy); + db.close(); + return cursor; + } + + /** + * 查询数据库,并把所要查询的数据,装入ContentValues对象中进行返回 + * @param tableName 表名 + * @param columns 指定要查询的列,如果为空,返回所有 + * @param selection 查询条件 使用 id=?形式,可用?占位符 + * @param selectionArgs where对应的条件值 + * @param groupBy 指定分组方式 + * @param having 指定having条件 + * @param orderBy 排序方式 + * @return 查询数据装入ContentValues对象中进行返回 + */ + public ContentValues[] queryValuesContent(@Nullable String tableName, + String[] columns, + @Nullable String selection, + @Nullable String[] selectionArgs, + @Nullable String groupBy, + @Nullable String having, + @Nullable String orderBy){ + SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase(); + //创建游标对象 + Cursor cursor = db.query(tableName, + columns, + selection, + selectionArgs, + groupBy, + having, + orderBy); + ContentValues[] values = cursorHandle(cursor, columns); + cursor.close(); + db.close(); + return values; + } + + /** + * 处理查询结果 + * @param cursor 查询数据库后返回的游标 + * @param columns 用户输入查询的列 + * @return 返回处理好后的结果 + */ + @SuppressLint("Range") + private ContentValues[] cursorHandle(Cursor cursor, String[] columns){ + ContentValues[] values = new ContentValues[cursor.getCount()]; + int nowRow = 0; + int colLen = (columns == null) ? 0 : columns.length; + while(cursor.moveToNext()){ + if(colLen > 0){ + for (String colName : columns) { + int colType = cursor.getType(cursor.getColumnIndex(colName)); + Object data = getDate(cursor, colType, colName); + if(data instanceof Byte[]){ + //二进制数据,转为String类型存入 + values[nowRow].put(colName, Byte.valueOf(String.valueOf(data))); + }else if(data instanceof Long){ + values[nowRow].put(colName, (Long) data); + }else if (data instanceof String){ + values[nowRow].put(colName, (String) data); + }else if (data instanceof Double){ + values[nowRow].put(colName, (Double) data); + }else{ + System.out.println("OtherType..............."); + } + } + } + } + return values; + } + + /** + * 解析对应类的数据 + * @param cursor 游标 + * @param colType 列类型 + * @param colName 列名字 + * @return 将对应数据转化为Object超类返回 + */ + @SuppressLint("Range") + private Object getDate(@Nullable Cursor cursor, int colType, @Nullable String colName){ + if(cursor == null){ + System.out.println("cursor = null................."); + return null; + } + Object obj = null; + switch (colType){ + case Cursor.FIELD_TYPE_NULL: { //空类型 + break; + } + case Cursor.FIELD_TYPE_INTEGER: { //integer + obj = cursor.getLong(cursor.getColumnIndex(colName)); + break; + } + case Cursor.FIELD_TYPE_FLOAT: { //浮动类型 + obj = cursor.getDouble(cursor.getColumnIndex(colName)); + break; + } + case Cursor.FIELD_TYPE_STRING: { //字符类型 + obj = cursor.getString(cursor.getColumnIndex(colName)); + break; + } + case Cursor.FIELD_TYPE_BLOB: { //二进制类型 + obj = cursor.getBlob(cursor.getColumnIndex(colName)); + break; + } + default: { + } + } + return obj; + } +} diff --git a/app/src/main/java/com/example/stlink/utils/QRCodeUtil.java b/app/src/main/java/com/example/stlink/utils/QRCodeUtil.java new file mode 100644 index 0000000..01f82ad --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/QRCodeUtil.java @@ -0,0 +1,106 @@ +package com.example.stlink.utils; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.media.Image; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import java.util.HashMap; +import java.util.Map; + +/** + * 二维码生成工具类 + */ +public class QRCodeUtil { + /** + * 创建二维码 + * + * @param content content + * @param widthPix widthPix + * @param heightPix heightPix + * @param logoBm logoBm + * @return 二维码 + */ + public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm) { + try { + if (content == null || "".equals(content)) { + return null; + } + // 配置参数 + Map hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 容错级别 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + // 图像数据转换,使用了矩阵转换 + BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, + heightPix, hints); + int[] pixels = new int[widthPix * heightPix]; + // 下面这里按照二维码的算法,逐个生成二维码的图片, + // 两个for循环是图片横列扫描的结果 + for (int y = 0; y < heightPix; y++) { + for (int x = 0; x < widthPix; x++) { + if (bitMatrix.get(x, y)) { + pixels[y * widthPix + x] = 0xff000000; + } else { + pixels[y * widthPix + x] = 0xffffffff; + } + } + } + // 生成二维码图片的格式,使用ARGB_8888 + Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); + if (logoBm != null) { + bitmap = addLogo(bitmap, logoBm); + } + //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大! + return bitmap; + } catch (WriterException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 在二维码中间添加Logo图案 + */ + private static Bitmap addLogo(Bitmap src, Bitmap logo) { + if (src == null) { + return null; + } + if (logo == null) { + return src; + } + //获取图片的宽高 + int srcWidth = src.getWidth(); + int srcHeight = src.getHeight(); + int logoWidth = logo.getWidth(); + int logoHeight = logo.getHeight(); + if (srcWidth == 0 || srcHeight == 0) { + return null; + } + if (logoWidth == 0 || logoHeight == 0) { + return src; + } + //logo大小为二维码整体大小的1/5 + float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; + Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888); + try { + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(src, 0, 0, null); + canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2); + canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null); + canvas.save(); + canvas.restore(); + } catch (Exception e) { + bitmap = null; + e.getStackTrace(); + } + return bitmap; + } +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/CheckCourseSignUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/CheckCourseSignUtil.java new file mode 100644 index 0000000..e509818 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/CheckCourseSignUtil.java @@ -0,0 +1,109 @@ +package com.example.stlink.utils.activityUtil; + +import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager2.widget.ViewPager2; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.ViewPagerAdapter; + +import java.util.List; + +public class CheckCourseSignUtil { + + private AppCompatActivity appCompatActivity; + private ViewPager2 viewPager2; // 视图 + private MenuItem menuItem; // + + private TextView tvSignList; + private TextView tvCourseSignStatus; + private TextView tvCourseSignLeave; + + public CheckCourseSignUtil(View view, AppCompatActivity appCompatActivity){ + this.appCompatActivity = appCompatActivity; + initData(view); + } + + private void initData(View view){ + // 视图翻页工具 + viewPager2 = view.findViewById(R.id.vp_course_sign_list); + + tvSignList = view.findViewById(R.id.tv_sign_list); + tvCourseSignStatus = view.findViewById(R.id.tv_course_sign_status); + tvCourseSignLeave = view.findViewById(R.id.tv_course_sign_leave); + tvSignList.setClickable(true); + tvCourseSignLeave.setClickable(true); + tvSignList.setFocusable(true); + tvCourseSignLeave.setFocusable(true); + + } + + /** + * 将碎片与ViewPager2进行绑定,并监听viewPager2的滑动 + */ + public void initPage(List list){ + // 设置点击触发 + tvSignList.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(0); + } + }); + tvCourseSignLeave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(2); + } + }); + // 注册页面改变的回调函数 + viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { // 声明页面切换后的回调函数 + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } + @Override + public void onPageSelected(int position) { //根据滑动设置被选择的碎片 + switch (position){ + case 0:{ + tvSignList.setSelected(true); + tvCourseSignStatus.setText("已签到"); + tvCourseSignLeave.setSelected(false); + break; + } + case 1:{ + tvSignList.setSelected(true); + tvCourseSignStatus.setText("未签到"); + tvCourseSignLeave.setSelected(false); + break; + } + case 2:{ + tvSignList.setSelected(false); + tvCourseSignLeave.setSelected(true); + break; + } + } + } + @Override + public void onPageScrollStateChanged(int state) { } + }); + setupViewPager(viewPager2, list); + } + + /** + * 将碎片与viewPager2进行绑定 + * @param viewPager2 碎片集中管理类 + * @param list 碎片列表 + */ + private void setupViewPager(ViewPager2 viewPager2, List list) { + FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager(); + // 将创建的碎片列表加入适配器中 + ViewPagerAdapter adapter = new ViewPagerAdapter(fragmentManager, appCompatActivity.getLifecycle(), list); + // viewPager2设置适配器 + viewPager2.setAdapter(adapter); + viewPager2.requestDisallowInterceptTouchEvent(true); + } + +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/CourseDetailUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/CourseDetailUtil.java new file mode 100644 index 0000000..3cc1429 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/CourseDetailUtil.java @@ -0,0 +1,121 @@ +package com.example.stlink.utils.activityUtil; + +import android.view.View; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager2.widget.ViewPager2; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.ViewPagerAdapter; + +import java.util.List; + +public class CourseDetailUtil { + + private AppCompatActivity appCompatActivity; + private ViewPager2 viewPager2; // 视图 + private TextView tvCourseIntro; + private TextView tvCourseClassList; + private TextView tvCourseSelectedStu; + + public CourseDetailUtil(AppCompatActivity appCompatActivity){ + this.appCompatActivity = appCompatActivity; + } + + public void initView(){ + // 视图翻页工具 + viewPager2 = appCompatActivity.findViewById(R.id.nav_course_detail_fragment); + tvCourseIntro = appCompatActivity.findViewById(R.id.tv_course_intro); + tvCourseClassList = appCompatActivity.findViewById(R.id.tv_course_class_list); + tvCourseSelectedStu = appCompatActivity.findViewById(R.id.tv_course_selected_stu); + + tvCourseIntro.setClickable(true); + tvCourseClassList.setClickable(true); + tvCourseSelectedStu.setClickable(true); + tvCourseIntro.setFocusable(true); + tvCourseClassList.setFocusable(true); + tvCourseSelectedStu.setFocusable(true); + } + + /** + * 将碎片与ViewPager2进行绑定,并监听viewPager2的滑动 + */ + public void initPage(List list){ + // 设置点击触发 + tvCourseIntro.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(0); + } + }); + tvCourseClassList.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(1); + } + }); + tvCourseSelectedStu.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(2); + } + }); + // 注册页面改变的回调函数 + viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { // 声明页面切换后的回调函数 + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } + @Override + public void onPageSelected(int position) { //根据滑动设置被选择的碎片 + switch (position){ + case 0:{ + tvCourseIntro.setSelected(true); + tvCourseClassList.setSelected(false); + tvCourseSelectedStu.setSelected(false); + tvCourseIntro.getPaint().setFakeBoldText(true); + tvCourseClassList.getPaint().setFakeBoldText(false); + tvCourseSelectedStu.getPaint().setFakeBoldText(false); + break; + } + case 1:{ + tvCourseIntro.setSelected(false); + tvCourseClassList.setSelected(true); + tvCourseSelectedStu.setSelected(false); + tvCourseIntro.getPaint().setFakeBoldText(false); + tvCourseClassList.getPaint().setFakeBoldText(true); + tvCourseSelectedStu.getPaint().setFakeBoldText(false); + break; + } + case 2:{ + tvCourseIntro.setSelected(false); + tvCourseClassList.setSelected(false); + tvCourseSelectedStu.setSelected(true); + tvCourseIntro.getPaint().setFakeBoldText(false); + tvCourseClassList.getPaint().setFakeBoldText(false); + tvCourseSelectedStu.getPaint().setFakeBoldText(true); + break; + } + } + } + @Override + public void onPageScrollStateChanged(int state) { } + }); + setupViewPager(viewPager2, list); + } + + /** + * 将碎片与viewPager2进行绑定 + * @param viewPager2 碎片集中管理类 + * @param list 碎片列表 + */ + private void setupViewPager(ViewPager2 viewPager2, List list) { + FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager(); + // 将创建的碎片列表加入适配器中 + ViewPagerAdapter adapter = new ViewPagerAdapter(fragmentManager, appCompatActivity.getLifecycle(), list); + // viewPager2设置适配器 + viewPager2.setAdapter(adapter); + viewPager2.requestDisallowInterceptTouchEvent(true); + } +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/CreateCourseUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/CreateCourseUtil.java new file mode 100644 index 0000000..e6ed22e --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/CreateCourseUtil.java @@ -0,0 +1,42 @@ +package com.example.stlink.utils.activityUtil; + +import android.os.Handler; +import android.os.Message; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.alibaba.fastjson.JSON; +import com.example.stlink.model.request.CourseCreateRequest; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; + +public class CreateCourseUtil { + + public static void createCourse(AppCompatActivity appCompatActivity, CourseCreateRequest courseCreateRequest, Handler handler, @Nullable String url) { + + new Thread(new Runnable() { + @Override + public void run() { + //fastJson将对象转换为JSON字符串 + String json = JSON.toJSONString(courseCreateRequest); + + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = "success"; + handler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = baseResponse.getMsg(); + handler .sendMessage(message); + } + }.postConnect(url, json); + } + }).start(); + } + +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/ImgUploadUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/ImgUploadUtil.java new file mode 100644 index 0000000..715030c --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/ImgUploadUtil.java @@ -0,0 +1,100 @@ +package com.example.stlink.utils.activityUtil; + +import android.graphics.ColorSpace; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +//import com.example.stlink.config.adapter.ImageAdapter; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; +import com.example.stlink.utils.httpUtils.PostFileHttpUtils; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; + +public class ImgUploadUtil { + + private static Bundle mBundle; + private static Handler mHandler; + private static String mImgId; + + public static void userImgUpload(Bundle bundle, Handler handler, @Nullable String path, String imgId) { + + mBundle = bundle; + mHandler = handler; + mImgId = imgId; + + mBundle.getBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS, false); + + new Thread(new Runnable() { + @Override + public void run() { + File file = null; + if (!TextUtils.isEmpty(path)) { + file = new File(path); + } + new PostFileHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + if(ModelFieldConstants.AVATAR.equals(mImgId)){ + userImgUploadNext(baseResponse); + }else if (ModelFieldConstants.COURSE_PHOTO.equals(mImgId)){ + Message message = new Message(); + mBundle.putString(mImgId, (String) baseResponse.getData()); + mBundle.putBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS, true); + message.obj = mBundle; + mHandler.sendMessage(message); + } + } + + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + System.out.println("上传失败......................."); + handler.sendMessage(message); + } + }.FileUpload(UrlConstants.FILE_UPLOAD, file); + } + }).start(); + } + + public static void userImgUploadNext(BaseResponse baseResponse){ + //构建mapBody + String imgUrl = (String) baseResponse.getData(); + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put(ModelFieldConstants.ID, (Long) mBundle.get(ModelFieldConstants.ID)); + jsonObject.put(mImgId, imgUrl); + } catch (JSONException e) { + e.printStackTrace(); + } + String json = jsonObject.toString(); + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + Message message = new Message(); + mBundle.putString(mImgId, imgUrl); + mBundle.putBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS, true); + message.obj = mBundle; + mHandler.sendMessage(message); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + System.out.println("修改失败......................."); + mBundle.putString(mImgId, imgUrl); + mBundle.putBoolean(UrlConstants.IS_IMG_UPLOAD_SUCCESS, false); + message.obj = mBundle; + mHandler.sendMessage(message); + } + }.postConnect(UrlConstants.USER_UPDATE, json); + } +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/LoginUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/LoginUtil.java new file mode 100644 index 0000000..f139a62 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/LoginUtil.java @@ -0,0 +1,275 @@ +package com.example.stlink.utils.activityUtil; + +import android.content.ContentValues; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.stlink.activitys.MainActivity; +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.SQLiteConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.contract.UserInfoContract; +import com.example.stlink.model.domain.User; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.MySQLiteDAO; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; +import com.google.android.material.textfield.TextInputLayout; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.internal.LinkedTreeMap; + +public class LoginUtil { + + private static AppCompatActivity loginActivity; + private static final LoginUtil LOGIN_UTIL = new LoginUtil(); + + private static String userName; + private static String pwdFirst; + private static String pwd; + private static TextInputLayout tlId; + private static TextInputLayout tlPwd; + private static Boolean isChecked; + private static Integer roleId; + + private static Handler handler; + private static Bundle bundle; + + private LoginUtil(){} + + + /** + * 用户登陆 + * @param appCompatActivity 上下文 + * @param btLogin 登录按钮 + * @param etAccount 账户输入 + * @param etPwd 密码输入 + * @param cbRememberPwd 是否保存密码 + */ + public static void userLogin(AppCompatActivity appCompatActivity, + Button btLogin, EditText etAccount, + EditText etPwd, CheckBox cbRememberPwd ){ + + loginActivity = appCompatActivity; + roleId = (Integer) appCompatActivity.getIntent().getExtras().get(ModelFieldConstants.ROLE_ID); + + //登录按钮 + btLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + pwdFirst = etPwd.getText().toString(); + userName = etAccount.getText().toString(); + isChecked = cbRememberPwd.isChecked(); + + tlId = appCompatActivity.findViewById(R.id.ll_id); + tlPwd = appCompatActivity.findViewById(R.id.ll_pwd); + + if( !TextUtils.isEmpty(userName) ){ + tlId.setError(""); + if( !TextUtils.isEmpty(pwdFirst)) { + tlPwd.setError(""); + LOGIN_UTIL.loginRequest(); + pwd = CommonUtils.encryptAndDencrypt(pwdFirst); + handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if("当前登录用户不存在".equals(msg.obj.toString())){ + tlId.setError(msg.obj.toString()); + }else if("密码错误".equals(msg.obj.toString())){ + tlPwd.setError(msg.obj.toString()); + }else{ + Toast.makeText( + appCompatActivity, + "登录失败", + Toast.LENGTH_SHORT + ).show(); + } + } + }; + }else{ + tlPwd.setError("密码不能为空"); + } + }else{ + tlId.setError("用户名不能为空"); + } + } + }); + } + + + /** + * 登录请求 + */ + private void loginRequest(){ + new Thread(new Runnable() { + @Override + public void run() { + // 密码要进行MD5加密 + String url = UrlConstants.USER_LOGIN + "?password=" + CommonUtils.MD5(pwd) + "&username=" + userName; + + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + + //解析数据 + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Object obj = baseResponse.getData(); + LinkedTreeMap userMap = null; + if(obj instanceof LinkedTreeMap){ + userMap = (LinkedTreeMap) obj; + } + //将LinkedTreeMap中字段映射到User类中 + User user = new User(); + String jsonString = gson.toJson(userMap); + user = gson.fromJson(jsonString, User.class); + System.out.println("user = " + user + ".................."); + //身份校验 + if(roleId.equals(user.getRoleId())){ + Intent intent = new Intent(loginActivity, MainActivity.class); + bundle = loginActivity.getIntent().getExtras(); + LOGIN_UTIL.saveUser(user); + intent.putExtras(bundle); + loginActivity.startActivity(intent); + }else{ + Message message = new Message(); + message.obj = "登录失败"; + handler.sendMessage(message); + } + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = baseResponse.getMsg(); + handler .sendMessage(message); + } + }.postConnect(url, ""); + } + }).start(); + } + + /** + * 将User插入到本地SQLite数据库中 + * @param user User实例 + */ + private void saveUser(@Nullable User user){ + // 密码保存到本地文件 + if(isChecked){ + CommonUtils.localSave(loginActivity, userName, pwdFirst, true); + } + if(user == null){ + System.out.println("user == null................"); + return; + } + + saveUserIntoIntent(user); + + saveUserIntoSQLite(user); + + } + + /** + * 用户信息保存到bundle中 + * @param user User实例 + */ + private void saveUserIntoIntent(User user){ + if(user.getId() != null){ + bundle.putLong(ModelFieldConstants.ID, user.getId()); + } + if(user.getRoleId() != null){ + bundle.putInt(ModelFieldConstants.ROLE_ID, user.getRoleId()); + } + if(user.getIdNumber() != null){ + bundle.putLong(ModelFieldConstants.ID_NUMBER, user.getIdNumber()); + } + if(user.getRealName() != null){ + bundle.putString(ModelFieldConstants.REAL_NAME, user.getRealName()); + } + if(user.getUserName() != null){ + bundle.putString(ModelFieldConstants.USER_NAME, user.getUserName()); + } + if(user.getCollegeName() != null){ + bundle.putString(ModelFieldConstants.COLLEGE_NAME, user.getCollegeName()); + } + if(user.getGender() != null){ + bundle.putBoolean(ModelFieldConstants.GENDER,user.getGender()); + } + if(user.getAvatar() != null){ + bundle.putString(ModelFieldConstants.AVATAR, user.getAvatar()); + } + if(user.getEmail() != null){ + bundle.putString(ModelFieldConstants.EMAIL, user.getEmail()); + } + if(user.getPhone() != null){ + bundle.putString(ModelFieldConstants.PHONE, user.getPhone()); + } + if(user.getInSchoolTime() != null){ + bundle.putLong(ModelFieldConstants.IN_SCHOOL_TIME, user.getInSchoolTime()); + } + if(user.getCreateTime() != null){ + bundle.putLong(ModelFieldConstants.CREATE_TIME, user.getCreateTime()); + } + } + + /** + * 保存用户实例到SQLite + * @param user 用户实例 + */ + private void saveUserIntoSQLite(User user){ + + MySQLiteDAO mySQLiteDAO = MySQLiteDAO.newInstance(); + //在本地建立SQLite数据库 + mySQLiteDAO.createTable( + loginActivity, + SQLiteConstants.USER_INFO_DATABASE_NAME, + null, + SQLiteConstants.DATABASE_FIRST_VERSION, + SQLiteConstants.USER_INFO_SQL_CREATE_ENTRIES, + SQLiteConstants.USER_INFO_SQL_DELETE_ENTRIES + ); + + //插入数据 + ContentValues values = new ContentValues(); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_APP_KEY, user.getAppKey()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_AVATAR, user.getAvatar()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_COLLEGE_NAME, user.getCollegeName()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_CREATE_TIME, user.getCreateTime()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_EMAIL, user.getEmail()); + //SQLite不支持存储boolean,用integer存 + values.put(UserInfoContract.UserEntry.COLUMN_NAME_GENDER, user.getGender() ? 0 : 1); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_ID, user.getId()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_ID_NUMBER, user.getIdNumber()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_IN_SCHOOL_TIME, user.getInSchoolTime()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_LAST_UPDATE_TIME, user.getLastUpdateTime()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_PHONE, user.getPhone()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_REAL_NAME, user.getRealName()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_ROLE_ID, user.getRoleId()); + values.put(UserInfoContract.UserEntry.COLUMN_NAME_USER_NAME, user.getUserName()); + + boolean isSuccess = mySQLiteDAO.insertValue( + UserInfoContract.UserEntry.TABLE_NAME, + null, + values + ); + if(isSuccess){ + System.out.println("SQLite:insert success............"); + }else{ + System.out.println("SQLite:insert failed............."); + } + } +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/MainActivityUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/MainActivityUtil.java new file mode 100644 index 0000000..3592756 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/MainActivityUtil.java @@ -0,0 +1,153 @@ +package com.example.stlink.utils.activityUtil; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.Gravity; +import android.view.MenuItem; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager2.widget.ViewPager2; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.ViewPagerAdapter; +import com.example.stlink.utils.CommonUtils; +import com.google.android.material.badge.BadgeDrawable; +import com.google.android.material.bottomnavigation.BottomNavigationView; + +import java.util.List; + +public class MainActivityUtil { + + private Boolean isExit = false; // 定义一个变量,来标识是否退出 + private MenuItem menuItem; // + private BottomNavigationView bottomNavigationView; //底部导航栏 + private BadgeDrawable badge; //设置班级列表消息的角标 + private ViewPager2 viewPager2; // 视图 + private Handler mHandler; // 3秒内连续点击两个退出键返回 + private AppCompatActivity appCompatActivity; + + public MainActivityUtil(){} + + public MainActivityUtil(AppCompatActivity appCompatActivity){ + this.appCompatActivity = appCompatActivity; + } + + /** + * 初始化页面 + */ + @SuppressLint("ResourceAsColor") + public void initView(){ + + //修改状态栏字体颜色 + CommonUtils.changeStatusBar(appCompatActivity); + + // 底部导航栏 + bottomNavigationView = appCompatActivity.findViewById(R.id.bottom_navigation_view); + // 设置角标 + badge = bottomNavigationView.getOrCreateBadge(R.id.class_list); + badge.setNumber(0); + badge.setVisible(false); + badge.setBadgeTextColor(R.color.black); + // 视图翻页工具 + viewPager2 = appCompatActivity.findViewById(R.id.nav_host_fragment); + // 消息延时处理,将退出标志设置未为false + mHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + isExit = false; + } + }; + } + + /** + * 将碎片与ViewPager2进行绑定,并监听viewPager2的滑动 + */ + public void initPager(List list){ + + // 设置底部导航栏的点击监听事件,未点击到点击状态触发 + bottomNavigationView.setOnItemSelectedListener(item -> { + int itemId = item.getItemId(); + if (itemId == R.id.home) {// 主页被点击 + viewPager2.setCurrentItem(0); + return true; + }else if( itemId == R.id.class_list){ // 班级列表被点击 + viewPager2.setCurrentItem(1); + return true; + }else if( itemId == R.id.my_info){ //个人中心被点击 + viewPager2.setCurrentItem(2); + return true; + }else { + return false; + } + }); + // 注册页面改变的回调函数 + viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { // 声明页面切换后的回调函数 + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } + @Override + public void onPageSelected(int position) { //根据滑动设置被选择的碎片 + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigationView.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigationView.getMenu().getItem(position); + menuItem.setChecked(true); + } + @Override + public void onPageScrollStateChanged(int state) { } + }); + setupViewPager(viewPager2, list); + } + + + /** + * 将碎片与viewPager2进行绑定 + * @param viewPager2 碎片集中管理类 + * @param list 碎片列表 + */ + private void setupViewPager(ViewPager2 viewPager2, List list) { + FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager(); + // 将创建的碎片列表加入适配器中 + ViewPagerAdapter adapter = new ViewPagerAdapter(fragmentManager, appCompatActivity.getLifecycle(), list); + // viewPager2设置适配器 + viewPager2.setAdapter(adapter); + //禁止自己滑动,解决嵌套的viewpager2能自由滑动 + + } + + + + /** + * 2、在exit方法中,会首先判断isExit的值,如果为false的话,则置为true, + * 同时会弹出提示,并在3000毫秒(3秒)后发出一个消息,在Handler中将此值还原成false。 + * 如果在发送消息间隔的2秒内,再次按了BACK键,则再次执行exit方法,此时isExit的值已 + * 为true,则会执行退出的方法。 + */ + public void setExit(){ + if (!isExit) { + isExit = true; + Toast toast = Toast.makeText(appCompatActivity.getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT); + toast.show(); + toast.setGravity(Gravity.CENTER, 0, 0); + //利用handler延迟发送更改状态信息,3000==3 + mHandler.sendEmptyMessageDelayed(0, 3000); + } else { + //在后台运行程序,不退出程序,只返回桌面 + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + appCompatActivity.startActivity(intent); + //退出程序代码 +// finish(); //结束程序 +// System.exit(0); //退出程序 + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/RegisterUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/RegisterUtil.java new file mode 100644 index 0000000..b3794c1 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/RegisterUtil.java @@ -0,0 +1,137 @@ +package com.example.stlink.utils.activityUtil; + +import android.content.Intent; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; + +import com.alibaba.fastjson.JSON; +import com.example.stlink.activitys.LoginActivity; +import com.example.stlink.R; +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.request.UserRegisterRequest; +import com.example.stlink.model.response.BaseResponse; +import com.example.stlink.utils.CommonUtils; +import com.example.stlink.utils.httpUtils.PostBodyParamHttpUtils; +import com.google.android.material.textfield.TextInputLayout; + +/** + * 注册相关方法 + */ +public class RegisterUtil { + + private static RegisterUtil registerUtils = new RegisterUtil(); + + private static AppCompatActivity registerActivity; + private static String userName; + private static String pwdFirst; + private static String pwdSecond; + private static String pwd; + private static TextInputLayout rlPwdFirst; + private static TextInputLayout rlPwdSecond; + private static TextInputLayout tlId; + + private static Handler handler; + + /** + * 为注册按钮添加点击监听事件 + * @param appCompatActivity 上下文 + * @param btRegister 注册按钮 + * @param etId 昵称输入 + * @param etPwdFirst 第一次密码输入框 + * @param etPwdSecond 第二次密码输入框 + */ + public static void userRegister(AppCompatActivity appCompatActivity, + Button btRegister, EditText etId, + EditText etPwdFirst, EditText etPwdSecond){ + registerActivity = appCompatActivity; + btRegister.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + userName = etId.getText().toString(); + pwdFirst = etPwdFirst.getText().toString(); + pwdSecond = etPwdSecond.getText().toString(); + + tlId = appCompatActivity.findViewById(R.id.rl_id); + rlPwdFirst = appCompatActivity.findViewById(R.id.rl_pwd_first); + rlPwdSecond = appCompatActivity.findViewById(R.id.rl_pwd_second); + + //用户名不能为空 + if( !TextUtils.isEmpty(userName) ){ + tlId.setError(""); + //密码不能为空 + if( !TextUtils.isEmpty(pwdFirst)){ + rlPwdFirst.setError(""); + if( !CommonUtils.isSamePwd(pwdFirst, pwdSecond)){ + rlPwdSecond.setError("两次输入不相同"); + }else{ + rlPwdSecond.setError(""); + pwd = CommonUtils.encryptAndDencrypt(pwdFirst); + registerUtils.registerRequest(); + + handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + tlId.setError(msg.obj.toString()); + } + }; + } + }else{ + rlPwdFirst.setError("密码不能为空"); + } + }else{ + tlId.setError("用户名不能为空"); + } + } + }); + } + + /** + * 向服务器请求数据的时候先 + */ + private void registerRequest(){ + + new Thread(new Runnable() { + @Override + public void run() { + UserRegisterRequest requestObj = new UserRegisterRequest(); + //fastJson将对象转换为JSON字符串 + requestObj.setUserName(userName); + //即将云端发送的密码要经过MD5加密,也就是异或运算和MD5的双重加密 + requestObj.setPassword(CommonUtils.MD5(pwd)); + requestObj.setRoleId( (Integer) registerActivity.getIntent().getExtras().get(ModelFieldConstants.ROLE_ID)); + System.out.println( "requestObj : " + requestObj.toString() + ".............................."); + String json = JSON.toJSONString(requestObj); + String url = UrlConstants.USER_REGISTER; + + new PostBodyParamHttpUtils() { + @Override + public void nextMethod(BaseResponse baseResponse) { + //保存在本地的密码只是进行了简单的异或运算 + CommonUtils.localSave(registerActivity, userName, pwdFirst, true); + Intent intent = new Intent(registerActivity, LoginActivity.class); + //将bundle中的数据再次传入新的intent中 + intent.putExtras(registerActivity.getIntent().getExtras()); + registerActivity.startActivity(intent); + } + @Override + public void failedMethod(BaseResponse baseResponse) { + Message message = new Message(); + message.obj = baseResponse.getMsg(); + handler .sendMessage(message); + } + }.postConnect(url, json); + } + }).start(); + } +} diff --git a/app/src/main/java/com/example/stlink/utils/activityUtil/TeaClassListUtil.java b/app/src/main/java/com/example/stlink/utils/activityUtil/TeaClassListUtil.java new file mode 100644 index 0000000..534437f --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/activityUtil/TeaClassListUtil.java @@ -0,0 +1,98 @@ +package com.example.stlink.utils.activityUtil; + +import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager2.widget.ViewPager2; + +import com.example.stlink.R; +import com.example.stlink.configs.adapter.ViewPagerAdapter; + +import java.util.List; + +public class TeaClassListUtil { + + private AppCompatActivity appCompatActivity; + private ViewPager2 viewPager2; // 视图 + private MenuItem menuItem; // + private TextView tvUnfinishedCourse; + private TextView tvFinishedCourse; + + public TeaClassListUtil(View view, AppCompatActivity appCompatActivity){ + this.appCompatActivity = appCompatActivity; + initData(view); + } + + private void initData(View view){ + // 视图翻页工具 + viewPager2 = view.findViewById(R.id.nav_course_list_fragment); + tvUnfinishedCourse = view.findViewById(R.id.tv_unfinished_course); + tvFinishedCourse = view.findViewById(R.id.tv_finished_course); + + tvUnfinishedCourse.setClickable(true); + tvFinishedCourse.setClickable(true); + tvUnfinishedCourse.setFocusable(true); + tvFinishedCourse.setFocusable(true); + } + + /** + * 将碎片与ViewPager2进行绑定,并监听viewPager2的滑动 + */ + public void initPage(List list){ + // 设置点击触发 + tvUnfinishedCourse.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(0); + } + }); + System.out.println(tvUnfinishedCourse.hasOnClickListeners()); + tvFinishedCourse.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager2.setCurrentItem(1); + } + }); + // 注册页面改变的回调函数 + viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { // 声明页面切换后的回调函数 + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } + @Override + public void onPageSelected(int position) { //根据滑动设置被选择的碎片 + switch (position){ + case 0:{ + tvUnfinishedCourse.setSelected(true); + tvFinishedCourse.setSelected(false); + break; + } + case 1:{ + tvUnfinishedCourse.setSelected(false); + tvFinishedCourse.setSelected(true); + break; + } + } + } + @Override + public void onPageScrollStateChanged(int state) { } + }); + setupViewPager(viewPager2, list); + } + + /** + * 将碎片与viewPager2进行绑定 + * @param viewPager2 碎片集中管理类 + * @param list 碎片列表 + */ + private void setupViewPager(ViewPager2 viewPager2, List list) { + FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager(); + // 将创建的碎片列表加入适配器中 + ViewPagerAdapter adapter = new ViewPagerAdapter(fragmentManager, appCompatActivity.getLifecycle(), list); + // viewPager2设置适配器 + viewPager2.setAdapter(adapter); + viewPager2.requestDisallowInterceptTouchEvent(true); + } +} diff --git a/app/src/main/java/com/example/stlink/utils/httpUtils/DeleteUrlParamHttpUtils.java b/app/src/main/java/com/example/stlink/utils/httpUtils/DeleteUrlParamHttpUtils.java new file mode 100644 index 0000000..0563ff9 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/httpUtils/DeleteUrlParamHttpUtils.java @@ -0,0 +1,121 @@ +package com.example.stlink.utils.httpUtils; + +import android.os.NetworkOnMainThreadException; + +import androidx.annotation.NonNull; + +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public abstract class DeleteUrlParamHttpUtils { + + /** + * post请求 + * @param url 网络请求地址 + */ + public void deleteConnect(String url){ + System.out.println("GET: loading..........."); + + //请求头 + Headers headers = new Headers.Builder() + .add("appId", UrlConstants.APP_ID) + .add("appSecret", UrlConstants.APP_SECRET) + .build(); + + //请求组合创建 + Request request = new Request.Builder() + .url(url) + .headers(headers) + .delete() + .build(); + try { + OkHttpClient client = new OkHttpClient(); + //发起请求 + System.out.println("GET:URL:" + url); + System.out.println("GET:CONNECT:start..........."); + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + + + private final Callback callback = new Callback() { + /** + * 主要是连接异常错误 + * @param call 回调 + * @param e 异常 + */ + @Override + public void onFailure(Call call, IOException e) { + //Log.e(TAG, "Failed to connect server!!!"); + e.printStackTrace(); + } + + @Override + public void onResponse(@NonNull Call call, Response response) throws IOException { + final String body = response.body().string(); + Gson gson = new Gson(); + Type jsonType = new TypeToken>() {}.getType(); + BaseResponse baseResponse = gson.fromJson(body, jsonType); + int code = baseResponse.getCode(); + //页面请求成功 + if(response.code() == 200){ + if (code == 200) { + System.out.println("GET:nextMethod..........."); + System.out.println("GET:code = " + baseResponse.getCode() + "..................."); + System.out.println("baseResponse:code = " + response.code()); + nextMethod(baseResponse); + }else if(code == 404){ + System.out.println("资源找不到...................."); + }else if(code == 500){ + System.out.println("GET:failed............."); + System.out.println("baseResponse:msg = " + baseResponse.getMsg() + "........................."); + System.out.println("GET:failedMethod"); + failedMethod(baseResponse); + }else if(code == 5217){ + System.out.println("没有或缺少 appId 或 appSecret..........................."); + }else if(code == 5311){ + System.out.println("接口使用次数不够................"); + }else if(code == 5314){ + System.out.println("请求参数不对................."); + }else{ + System.out.println("GET:connect...error..................."); + System.out.println("GET:code = " + response.code()); + } + }else if(code == 401){ + System.out.println("未授权........................."); + }else{ + System.out.println("GET:connect...error..................."); + System.out.println("GET:code = " + response.code()); + System.out.println("response: " + response); + System.out.println("baseResponse: " + baseResponse); + } + + } + }; + + + /** + * post成功的后续动作 + */ + public abstract void nextMethod(BaseResponse baseResponse); + + /** + * post失败的后续动作 + */ + public abstract void failedMethod(BaseResponse baseResponse); + +} diff --git a/app/src/main/java/com/example/stlink/utils/httpUtils/GetUrlParamHttpUtils.java b/app/src/main/java/com/example/stlink/utils/httpUtils/GetUrlParamHttpUtils.java new file mode 100644 index 0000000..1831725 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/httpUtils/GetUrlParamHttpUtils.java @@ -0,0 +1,122 @@ +package com.example.stlink.utils.httpUtils; + +import android.os.NetworkOnMainThreadException; + +import androidx.annotation.NonNull; + +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Credentials; +import okhttp3.Headers; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public abstract class GetUrlParamHttpUtils { + + /** + * post请求 + * @param url 网络请求地址 + */ + public void getConnect(String url){ + System.out.println("GET: loading..........."); + + //请求头 + Headers headers = new Headers.Builder() + .add("appId", UrlConstants.APP_ID) + .add("appSecret", UrlConstants.APP_SECRET) + .build(); + + //请求组合创建 + Request request = new Request.Builder() + .url(url) + .headers(headers) + .get() + .build(); + try { + OkHttpClient client = new OkHttpClient(); + //发起请求 + System.out.println("GET:URL:" + url); + System.out.println("GET:CONNECT:start..........."); + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + + + private final Callback callback = new Callback() { + /** + * 主要是连接异常错误 + * @param call 回调 + * @param e 异常 + */ + @Override + public void onFailure(Call call, IOException e) { + //Log.e(TAG, "Failed to connect server!!!"); + e.printStackTrace(); + } + + @Override + public void onResponse(@NonNull Call call, Response response) throws IOException { + final String body = response.body().string(); + Gson gson = new Gson(); + Type jsonType = new TypeToken>() {}.getType(); + BaseResponse baseResponse = gson.fromJson(body, jsonType); + int code = baseResponse.getCode(); + //页面请求成功 + if(response.code() == 200){ + if (code == 200) { + System.out.println("GET:nextMethod..........."); + System.out.println("GET:code = " + baseResponse.getCode() + "..................."); + System.out.println("baseResponse:code = " + response.code()); + nextMethod(baseResponse); + }else if(code == 404){ + System.out.println("资源找不到...................."); + }else if(code == 500){ + System.out.println("GET:failed............."); + System.out.println("baseResponse:msg = " + baseResponse.getMsg() + "........................."); + System.out.println("GET:failedMethod"); + failedMethod(baseResponse); + }else if(code == 5217){ + System.out.println("没有或缺少 appId 或 appSecret..........................."); + }else if(code == 5311){ + System.out.println("接口使用次数不够................"); + }else if(code == 5314){ + System.out.println("请求参数不对................."); + }else{ + System.out.println("GET:connect...error..................."); + System.out.println("GET:code = " + response.code()); + } + }else if(code == 401){ + System.out.println("未授权........................."); + }else{ + System.out.println("GET:connect...error..................."); + System.out.println("GET:code = " + response.code()); + System.out.println("response: " + response); + System.out.println("baseResponse: " + baseResponse); + } + + } + }; + + + /** + * post成功的后续动作 + */ + public abstract void nextMethod(BaseResponse baseResponse); + + /** + * post失败的后续动作 + */ + public abstract void failedMethod(BaseResponse baseResponse); + +} diff --git a/app/src/main/java/com/example/stlink/utils/httpUtils/PostBodyParamHttpUtils.java b/app/src/main/java/com/example/stlink/utils/httpUtils/PostBodyParamHttpUtils.java new file mode 100644 index 0000000..a982c48 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/httpUtils/PostBodyParamHttpUtils.java @@ -0,0 +1,134 @@ +package com.example.stlink.utils.httpUtils; + +import android.os.NetworkOnMainThreadException; +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.lang.reflect.Type; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Credentials; +import okhttp3.Headers; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +/** + * 封装起来okHttp3请求 + */ +public abstract class PostBodyParamHttpUtils { + + /** + * post请求 + * @param url 网络请求地址 + * @param json body中待封装的json体 + */ + public void postConnect(String url, String json){ + System.out.println("POST: loading..........."); + System.out.println("POST: json: " + json); + //请求头 + Headers headers = new Headers.Builder() + .add("appId", UrlConstants.APP_ID) + .add("appSecret", UrlConstants.APP_SECRET) + .build(); + Request request; + //请求组合创建 + if( !TextUtils.isEmpty(json) ){ + request = new Request.Builder() + .url(url) + .headers(headers) + .post(RequestBody.create(UrlConstants.MEDIA_TYPE_JSON, json)) + .build(); + }else{ + request = new Request.Builder() + .url(url) + .headers(headers) + .post(RequestBody.create(UrlConstants.MEDIA_TYPE_JSON, "")) + .build(); + } + try { + OkHttpClient client = new OkHttpClient(); + //发起请求 + System.out.println("POST:URL:" + url); + System.out.println("POST:CONNECT:start..........."); + client.newCall(request).enqueue(callback); + }catch (NetworkOnMainThreadException ex){ + ex.printStackTrace(); + } + } + + + private final Callback callback = new Callback() { + /** + * 主要是连接异常错误 + * @param call 回调 + * @param e 异常 + */ + @Override + public void onFailure(Call call, IOException e) { + //Log.e(TAG, "Failed to connect server!!!"); + e.printStackTrace(); + } + + @Override + public void onResponse(@NonNull Call call, Response response) throws IOException { + final String body = response.body().string(); + Gson gson = new Gson(); + Type jsonType = new TypeToken>() {}.getType(); + BaseResponse baseResponse = gson.fromJson(body, jsonType); + int code = baseResponse.getCode(); + //页面请求成功 + if(response.code() == 200){ + if (code == 200) { + System.out.println("POST:nextMethod..........."); + System.out.println("POST:code = " + baseResponse.getCode() + "..................."); + System.out.println("baseResponse:code = " + response.code()); + nextMethod(baseResponse); + }else if(code == 404){ + System.out.println("资源找不到...................."); + }else if(code == 500){ + System.out.println("POST:failed............."); + System.out.println("baseResponse:msg = " + baseResponse.getMsg() + "........................."); + System.out.println("Response:failedMethod"); + failedMethod(baseResponse); + }else if(code == 5217){ + System.out.println("没有或缺少 appId 或 appSecret..........................."); + }else if(code == 5311){ + System.out.println("接口使用次数不够................"); + }else if(code == 5314){ + System.out.println("请求参数不对................."); + }else{ + System.out.println("response:code = " + response.code()); + } + }else if(code == 401) { + System.out.println("未授权........................."); + }else{ + System.out.println("response:connect...error..................."); + System.out.println("response:code = " + response.code()); + System.out.println("response: " + response); + System.out.println("baseResponse: " + baseResponse.toString()); + } + + } + }; + + /** + * post成功的后续动作 + */ + public abstract void nextMethod(BaseResponse baseResponse); + + /** + * post失败的后续动作 + */ + public abstract void failedMethod(BaseResponse baseResponse); + +} diff --git a/app/src/main/java/com/example/stlink/utils/httpUtils/PostFileHttpUtils.java b/app/src/main/java/com/example/stlink/utils/httpUtils/PostFileHttpUtils.java new file mode 100644 index 0000000..6961249 --- /dev/null +++ b/app/src/main/java/com/example/stlink/utils/httpUtils/PostFileHttpUtils.java @@ -0,0 +1,132 @@ +package com.example.stlink.utils.httpUtils; + +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.example.stlink.model.constants.ModelFieldConstants; +import com.example.stlink.model.constants.UrlConstants; +import com.example.stlink.model.response.BaseResponse; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.concurrent.TimeUnit; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public abstract class PostFileHttpUtils { + + public void FileUpload(String url, File file){ + System.out.println("POST: loading..........."); + if(file == null){ + System.out.println("POST: file is null"); + return; + } + //请求头 + Headers headers = new Headers.Builder() + .add("appId", UrlConstants.APP_ID) + .add("appSecret", UrlConstants.APP_SECRET) + .build(); + MultipartBody multipartBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + // 这里设置要传给后台的参数;如果要添加多个参数,可以先获取到MultipartBody.Builder对象,然后再for循环添加 + // 约定key 如 "certificate" 作为后台接受图片的key;这里约定的key是:certificate + .addFormDataPart(ModelFieldConstants.FILE, file.getName(), RequestBody.create(UrlConstants.MEDIA_TYPE_PNG, file)) + .build(); + + //构建Request请求体 + Request.Builder RequestBuilder = new Request.Builder(); + Request request = RequestBuilder + // 添加URL地址 + .url(url) + .headers(headers) + .post(multipartBody) + .build(); + // 构建 OkHttpClient 请求对象,后面大家都很熟悉了,不多说 + OkHttpClient mOkHttpClient = new OkHttpClient.Builder() + .connectTimeout(30 * 1000, TimeUnit.MILLISECONDS) + .readTimeout(30 * 1000, TimeUnit.MILLISECONDS) + .build(); + mOkHttpClient.newCall(request).enqueue(callback); + } + + + private final Callback callback = new Callback() { + + + /** + * 主要是连接异常错误 + * @param call 回调 + * @param e 异常 + */ + @Override + public void onFailure(Call call, IOException e) { + Log.e("TAGTAG", "onFailure,图片上传失败:" + e.getMessage()); + e.printStackTrace(); + } + + @Override + public void onResponse(@NonNull Call call, Response response) throws IOException { + + final String body = response.body().string(); + Log.e("TAGTAG", "onResponse,图片上传成功:" + body); + Gson gson = new Gson(); + Type jsonType = new TypeToken>() {}.getType(); + BaseResponse baseResponse = gson.fromJson(body, jsonType); + int code = baseResponse.getCode(); + //页面请求成功 + if(response.code() == 200){ + if (code == 200) { + System.out.println("POST:nextMethod..........."); + System.out.println("POST:code = " + baseResponse.getCode() + "..................."); + System.out.println("baseResponse:code = " + response.code()); + nextMethod(baseResponse); + }else if(code == 404){ + System.out.println("资源找不到...................."); + }else if(code == 500){ + System.out.println("POST:failed............."); + System.out.println("baseResponse:msg = " + baseResponse.getMsg() + "........................."); + System.out.println("Response:failedMethod"); + failedMethod(baseResponse); + }else if(code == 5217){ + System.out.println("没有或缺少 appId 或 appSecret..........................."); + }else if(code == 5311){ + System.out.println("接口使用次数不够................"); + }else if(code == 5314){ + System.out.println("请求参数不对................."); + }else{ + System.out.println("response:code = " + response.code()); + } + }else if(code == 401) { + System.out.println("未授权........................."); + }else{ + System.out.println("response:connect...error..................."); + System.out.println("response:code = " + response.code()); + System.out.println("response: " + response); + System.out.println("baseResponse: " + baseResponse); + } + + } + + }; + + /** + * post成功的后续动作 + */ + public abstract void nextMethod(BaseResponse baseResponse); + + /** + * post失败的后续动作 + */ + public abstract void failedMethod(BaseResponse baseResponse); +} diff --git a/app/src/main/res/drawable/b_login_identity_choose.xml b/app/src/main/res/drawable/b_login_identity_choose.xml new file mode 100644 index 0000000..d36b373 --- /dev/null +++ b/app/src/main/res/drawable/b_login_identity_choose.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/clip_login_loading_loading.xml b/app/src/main/res/drawable/clip_login_loading_loading.xml new file mode 100644 index 0000000..8479fa5 --- /dev/null +++ b/app/src/main/res/drawable/clip_login_loading_loading.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_add_24.xml b/app/src/main/res/drawable/ic_baseline_add_24.xml new file mode 100644 index 0000000..5f444cf --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_add_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_add_24_grey.xml b/app/src/main/res/drawable/ic_baseline_add_24_grey.xml new file mode 100644 index 0000000..182d614 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_add_24_grey.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_add_circle_outline_24.xml b/app/src/main/res/drawable/ic_baseline_add_circle_outline_24.xml new file mode 100644 index 0000000..a1c721d --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_add_circle_outline_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_chevron_left_24.xml b/app/src/main/res/drawable/ic_baseline_chevron_left_24.xml new file mode 100644 index 0000000..09598f1 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_chevron_left_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_clear_24.xml b/app/src/main/res/drawable/ic_baseline_clear_24.xml new file mode 100644 index 0000000..16d6d37 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_clear_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_clear_24_red.xml b/app/src/main/res/drawable/ic_baseline_clear_24_red.xml new file mode 100644 index 0000000..a054ab4 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_clear_24_red.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml new file mode 100644 index 0000000..d3d6259 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24_grey.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24_grey.xml new file mode 100644 index 0000000..a4f2daa --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24_grey.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_lock_24.xml b/app/src/main/res/drawable/ic_baseline_lock_24.xml new file mode 100644 index 0000000..d619102 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_lock_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_person_24.xml b/app/src/main/res/drawable/ic_baseline_person_24.xml new file mode 100644 index 0000000..6bdced2 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_person_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_visibility_24.xml b/app/src/main/res/drawable/ic_baseline_visibility_24.xml new file mode 100644 index 0000000..a3e222a --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_visibility_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_visibility_off_24.xml b/app/src/main/res/drawable/ic_baseline_visibility_off_24.xml new file mode 100644 index 0000000..92c4856 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_visibility_off_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/pb_login_loading.xml b/app/src/main/res/drawable/pb_login_loading.xml new file mode 100644 index 0000000..1a2e334 --- /dev/null +++ b/app/src/main/res/drawable/pb_login_loading.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_bottom_add_course.xml b/app/src/main/res/drawable/selector_bottom_add_course.xml new file mode 100644 index 0000000..2f80ff4 --- /dev/null +++ b/app/src/main/res/drawable/selector_bottom_add_course.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_bottom_modify_info_save_1.xml b/app/src/main/res/drawable/selector_bottom_modify_info_save_1.xml new file mode 100644 index 0000000..415594d --- /dev/null +++ b/app/src/main/res/drawable/selector_bottom_modify_info_save_1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_bottom_modify_info_save_2.xml b/app/src/main/res/drawable/selector_bottom_modify_info_save_2.xml new file mode 100644 index 0000000..6d86032 --- /dev/null +++ b/app/src/main/res/drawable/selector_bottom_modify_info_save_2.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_bottom_my_info.xml b/app/src/main/res/drawable/selector_bottom_my_info.xml new file mode 100644 index 0000000..7dba9a9 --- /dev/null +++ b/app/src/main/res/drawable/selector_bottom_my_info.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_bottom_navigation.xml b/app/src/main/res/drawable/selector_bottom_navigation.xml new file mode 100644 index 0000000..5fc17b0 --- /dev/null +++ b/app/src/main/res/drawable/selector_bottom_navigation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_float_bottom_background.xml b/app/src/main/res/drawable/selector_float_bottom_background.xml new file mode 100644 index 0000000..c7da762 --- /dev/null +++ b/app/src/main/res/drawable/selector_float_bottom_background.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_float_bottom_src.xml b/app/src/main/res/drawable/selector_float_bottom_src.xml new file mode 100644 index 0000000..40f11e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_float_bottom_src.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_home_bt_sign.xml b/app/src/main/res/drawable/selector_home_bt_sign.xml new file mode 100644 index 0000000..d53aa5a --- /dev/null +++ b/app/src/main/res/drawable/selector_home_bt_sign.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_input_text_add_course.xml b/app/src/main/res/drawable/selector_input_text_add_course.xml new file mode 100644 index 0000000..14bddb3 --- /dev/null +++ b/app/src/main/res/drawable/selector_input_text_add_course.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_input_text_modify_msg.xml b/app/src/main/res/drawable/selector_input_text_modify_msg.xml new file mode 100644 index 0000000..c4dc9a3 --- /dev/null +++ b/app/src/main/res/drawable/selector_input_text_modify_msg.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_my_info_about.xml b/app/src/main/res/drawable/selector_my_info_about.xml new file mode 100644 index 0000000..ed1d229 --- /dev/null +++ b/app/src/main/res/drawable/selector_my_info_about.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_my_info_detail.xml b/app/src/main/res/drawable/selector_my_info_detail.xml new file mode 100644 index 0000000..bcd7045 --- /dev/null +++ b/app/src/main/res/drawable/selector_my_info_detail.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_my_info_title.xml b/app/src/main/res/drawable/selector_my_info_title.xml new file mode 100644 index 0000000..ea0444b --- /dev/null +++ b/app/src/main/res/drawable/selector_my_info_title.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_text_course.xml b/app/src/main/res/drawable/selector_text_course.xml new file mode 100644 index 0000000..dc5ed09 --- /dev/null +++ b/app/src/main/res/drawable/selector_text_course.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_time_choose.xml b/app/src/main/res/drawable/selector_time_choose.xml new file mode 100644 index 0000000..0f7cfb8 --- /dev/null +++ b/app/src/main/res/drawable/selector_time_choose.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_top_nav_background.xml b/app/src/main/res/drawable/selector_top_nav_background.xml new file mode 100644 index 0000000..81dc14a --- /dev/null +++ b/app/src/main/res/drawable/selector_top_nav_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_top_nav_item_background.xml b/app/src/main/res/drawable/selector_top_nav_item_background.xml new file mode 100644 index 0000000..9a58023 --- /dev/null +++ b/app/src/main/res/drawable/selector_top_nav_item_background.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_all_course.xml b/app/src/main/res/layout/activity_all_course.xml new file mode 100644 index 0000000..b9e73a3 --- /dev/null +++ b/app/src/main/res/layout/activity_all_course.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_choose_course.xml b/app/src/main/res/layout/activity_choose_course.xml new file mode 100644 index 0000000..a393d88 --- /dev/null +++ b/app/src/main/res/layout/activity_choose_course.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_course_detail.xml b/app/src/main/res/layout/activity_course_detail.xml new file mode 100644 index 0000000..5bb41d3 --- /dev/null +++ b/app/src/main/res/layout/activity_course_detail.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml new file mode 100644 index 0000000..b0bbc01 --- /dev/null +++ b/app/src/main/res/layout/activity_launch.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..d7f62eb --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +