commit 67ac7208330dffcbecae45aabd6932f2670c28c2 Author: wanghao Date: Tue May 27 15:13:34 2025 +0800 完成开锁 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..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5b6b8c0 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..022ab29 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4fba3e9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file 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..f614ad0 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,53 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.beijingnopowercon' + compileSdk 33 + + defaultConfig { + applicationId "com.example.beijingnopowercon" + minSdk 28 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + buildFeatures { + viewBinding true + dataBinding true + } +} + +dependencies { + implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' + implementation 'androidx.navigation:navigation-fragment:2.5.3' + implementation 'androidx.navigation:navigation-ui:2.5.3' + implementation 'androidx.annotation:annotation:1.6.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + implementation 'com.lzy.net:okgo:3.0.4' + implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.zxing:core:3.5.3' + implementation 'com.journeyapps:zxing-android-embedded:4.3.0' + +} \ No newline at end of file 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/src/androidTest/java/com/example/beijingnopowercon/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/beijingnopowercon/ExampleInstrumentedTest.java new file mode 100644 index 0000000..dd11710 --- /dev/null +++ b/app/src/androidTest/java/com/example/beijingnopowercon/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.beijingnopowercon; + +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.beijingnopowercon", 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..70a8ec4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/CustomScannerActivity.java b/app/src/main/java/com/example/beijingnopowercon/CustomScannerActivity.java new file mode 100644 index 0000000..35e5ae1 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/CustomScannerActivity.java @@ -0,0 +1,73 @@ +package com.example.beijingnopowercon; + +import android.os.Bundle; +import android.view.animation.Animation; +import android.view.animation.TranslateAnimation; +import android.widget.ImageView; + +import androidx.appcompat.app.AppCompatActivity; +import com.journeyapps.barcodescanner.CaptureManager; +import com.journeyapps.barcodescanner.DecoratedBarcodeView; + +public class CustomScannerActivity extends AppCompatActivity { + private CaptureManager captureManager; + private DecoratedBarcodeView barcodeScannerView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_custom_scanner); + barcodeScannerView = findViewById(R.id.barcode_scanner); + + captureManager = new CaptureManager(this, barcodeScannerView); + captureManager.initializeFromIntent(getIntent(), savedInstanceState); + captureManager.decode(); + // 初始化视图 + ImageView scanLine = findViewById(R.id.scan_line); + + // 设置扫描线动画 + TranslateAnimation animation = new TranslateAnimation( + TranslateAnimation.ABSOLUTE, 0f, + TranslateAnimation.ABSOLUTE, 0f, + TranslateAnimation.ABSOLUTE, 0f, + TranslateAnimation.ABSOLUTE, 800f); + animation.setDuration(2000); + animation.setRepeatCount(Animation.INFINITE); + animation.setRepeatMode(Animation.RESTART); + scanLine.startAnimation(animation); + findViewById(R.id.back_button).setOnClickListener(v -> { + finish(); + }); + } + + @Override + protected void onResume() { + super.onResume(); + captureManager.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + captureManager.onPause(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + captureManager.onDestroy(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + captureManager.onSaveInstanceState(outState); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + captureManager.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/LoginActivity.java b/app/src/main/java/com/example/beijingnopowercon/LoginActivity.java new file mode 100644 index 0000000..428f938 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/LoginActivity.java @@ -0,0 +1,77 @@ +package com.example.beijingnopowercon; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + +import com.example.beijingnopowercon.base.MyApplication; +import com.example.beijingnopowercon.data.LoginUser; +import com.example.beijingnopowercon.data.LoginVm; +import com.example.beijingnopowercon.databinding.ActivityLoginBinding; +import com.example.beijingnopowercon.dialog.LoadDialog; +import com.example.beijingnopowercon.okgo.MyRecultCall; +import com.example.beijingnopowercon.okgo.MyResult; +import com.example.beijingnopowercon.uitls.SharedPreferencesUtils; +import com.google.gson.Gson; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.Response; + +public class LoginActivity extends AppCompatActivity { + private LoginVm loginVm; + private Context context; + private LoadDialog dialog; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login); + boolean isRemember = SharedPreferencesUtils.getboolean("isRemember", false); + loginVm = new LoginVm(); + if (isRemember) { + loginVm.setName(SharedPreferencesUtils.getstring("user", "")); + loginVm.setPass(SharedPreferencesUtils.getstring("pass", "")); + loginVm.setRemember(isRemember); + } + binding.setUser(loginVm); + // EasyUpdate.checkUpdate(this, url + "/getVersion"); + context = this; + dialog = new LoadDialog(this); + } + + public void loginSubmit(View view) { + String pass = loginVm.getPass(); + String name = loginVm.getName(); + if (pass == null || name == null || pass.isEmpty() || name.isEmpty()) return; + + OkGo.get(MyApplication.url + "/login/finduser").tag(this).params("name", name).params("pass", pass).execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode() == 0) { + LoginUser user = new Gson().fromJson(body.getDataJson(), LoginUser.class); + SharedPreferencesUtils.putLong("userId",user.getUserId()); + SharedPreferencesUtils.putLong("deptId",user.getDeptId()); + boolean remember = loginVm.isRemember(); + if (remember) { + SharedPreferencesUtils.putboolean("isRemember", remember); + SharedPreferencesUtils.putstring("user", name); + SharedPreferencesUtils.putstring("pass", pass); + Intent intent = new Intent(context, MainActivity.class); + startActivity(intent); + + finish(); + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + } + }); + + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/MainActivity.java b/app/src/main/java/com/example/beijingnopowercon/MainActivity.java new file mode 100644 index 0000000..539bf25 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/MainActivity.java @@ -0,0 +1,59 @@ +package com.example.beijingnopowercon; + +import android.os.Bundle; +import android.view.View; +import android.view.Menu; + +import com.google.android.material.snackbar.Snackbar; +import com.google.android.material.navigation.NavigationView; + +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.AppBarConfiguration; +import androidx.navigation.ui.NavigationUI; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.appcompat.app.AppCompatActivity; + +import com.example.beijingnopowercon.databinding.ActivityMainBinding; + +public class MainActivity extends AppCompatActivity { + + private AppBarConfiguration mAppBarConfiguration; + private ActivityMainBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.appBarMain.toolbar); + + DrawerLayout drawer = binding.drawerLayout; + NavigationView navigationView = binding.navView; + // Passing each menu ID as a set of Ids because each + // menu should be considered as top level destinations. + mAppBarConfiguration = new AppBarConfiguration.Builder( + R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow) + .setOpenableLayout(drawer) + .build(); + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); + NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); + NavigationUI.setupWithNavController(navigationView, navController); + } + + // @Override + // public boolean onCreateOptionsMenu(Menu menu) { + // // Inflate the menu; this adds items to the action bar if it is present. + // getMenuInflater().inflate(R.menu.main, menu); + // return true; + // } + + @Override + public boolean onSupportNavigateUp() { + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); + return NavigationUI.navigateUp(navController, mAppBarConfiguration) + || super.onSupportNavigateUp(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/base/BaseFragment.java b/app/src/main/java/com/example/beijingnopowercon/base/BaseFragment.java new file mode 100644 index 0000000..97c59f0 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/base/BaseFragment.java @@ -0,0 +1,32 @@ +package com.example.beijingnopowercon.base; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; + +import com.example.beijingnopowercon.dialog.LoadDialog; +import com.google.gson.Gson; + +public class BaseFragment extends Fragment { + + public Context context; + public LoadDialog dialog; + public String url; + public Gson gson; + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + this.context=context; + dialog=new LoadDialog(context); + url=MyApplication.url; + gson=new Gson(); + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java b/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java new file mode 100644 index 0000000..4344558 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/base/MyApplication.java @@ -0,0 +1,79 @@ +package com.example.beijingnopowercon.base; + +import android.app.Application; + +import com.example.beijingnopowercon.uitls.SharedPreferencesUtils; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.cache.CacheEntity; +import com.lzy.okgo.cache.CacheMode; +import com.lzy.okgo.cookie.CookieJarImpl; +import com.lzy.okgo.cookie.store.MemoryCookieStore; +import com.lzy.okgo.https.HttpsUtils; +import com.lzy.okgo.interceptor.HttpLoggingInterceptor; + +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; + +import okhttp3.OkHttpClient; + + +/** + * @author: wangh + * @description: + * @date: 2019/06/11-13:01 + */ +public class MyApplication extends Application { + + private static MyApplication application; + + public static MyApplication getApplication() { + return application; + } + public static String url="http://192.168.137.1:8091/api"; + @Override + public void onCreate() { + super.onCreate(); + application = this; + SharedPreferencesUtils.init(getApplicationContext(), "nopower"); + okGoBase(); + // XUpdate.get().debug(true).isWifiOnly(false) // 默认设置只在wifi下检查版本更新 + // .isGet(true) // 默认设置使用get请求检查版本 + // .isAutoMode(false) // 默认设置非自动模式,可根据具体使用配置 + // // .param("versionCode", UpdateUtils.getVersionCode(this)) //设置默认公共请求参数 + // // .param("appKey", getPackageName()) + // + // .supportSilentInstall(false) // 设置是否支持静默安装,默认是true + // .setIUpdateHttpService(new OkHttpUpdateHttpServiceImpl()) // 这个必须设置!实现网络请求功能。 + // .init(this); + } + + // OKGO 初始化 + private void okGoBase() { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkGo"); + // log打印级别,决定了log显示的详细程度 + loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY); + // log颜色级别,决定了log在控制台显示的颜色 + loggingInterceptor.setColorLevel(Level.SEVERE); + // 方法一:信任所有证书,不安全有风险 + HttpsUtils.SSLParams sslParams1 = HttpsUtils.getSslSocketFactory(); + builder.sslSocketFactory(sslParams1.sSLSocketFactory, sslParams1.trustManager); + builder.addInterceptor(loggingInterceptor); + // 全局的读取超时时间 + builder.readTimeout(6000, TimeUnit.MILLISECONDS); + // 全局的写入超时时间 + builder.writeTimeout(6000, TimeUnit.MILLISECONDS); + // 全局的连接超时时间 + builder.connectTimeout(6000, TimeUnit.MILLISECONDS); + // 使用内存保持cookie,app退出后,cookie消失 + builder.cookieJar(new CookieJarImpl(new MemoryCookieStore())); + OkGo.getInstance().init(this).setOkHttpClient(builder.build()) // 建议设置OkHttpClient,不设置将使用默认的 + .setCacheMode(CacheMode.NO_CACHE) // 全局统一缓存模式,默认不使用缓存,可以不传 + .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE) // 全局统一缓存时间,默认永不过期,可以不传 + .setRetryCount(0); + + + } + + +} diff --git a/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java b/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java new file mode 100644 index 0000000..20ec1c2 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/data/DeviceInfo.java @@ -0,0 +1,203 @@ +package com.example.beijingnopowercon.data; + +/** + * 设备基础信息对象 device_base_info + * + * @author ruoyi + * @date 2025-05-19 + */ +public class DeviceInfo { + + + /** + * 主键 + */ + private Long objId; + + /** + * 设备编码 + */ + private String deviceCode; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备类型 + */ + private Long deviceType; + + /** + * 使用状态 + */ + private String useState; + + /** + * 设备状态 + */ + private String deviceState; + + /** + * 摆放桩位 + */ + private String locationName; + + /** + * 开锁密码 + */ + private String openPassword; + private String typeName; + private Double defaultPrice; + + /** + * 默认使用时间 + */ + private Double defaultTime; + private String remark; + + /** 用户ID */ + private Long userId; + + /** 部门ID */ + private Long deptId; + private String useUser; + + public String getUseUser() { + return useUser; + } + + public void setUseUser(String useUser) { + this.useUser = useUser; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Double getDefaultPrice() { + return defaultPrice; + } + + public void setDefaultPrice(Double defaultPrice) { + this.defaultPrice = defaultPrice; + } + + public Double getDefaultTime() { + return defaultTime; + } + + public void setDefaultTime(Double defaultTime) { + this.defaultTime = defaultTime; + } + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getDeviceCode() { + return deviceCode; + } + + public void setDeviceCode(String deviceCode) { + this.deviceCode = deviceCode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public Long getDeviceType() { + return deviceType; + } + + public void setDeviceType(Long deviceType) { + this.deviceType = deviceType; + } + + public String getUseState() { + return useState; + } + + public void setUseState(String useState) { + this.useState = useState; + } + + public String getDeviceState() { + return deviceState; + } + + private String deviceStateName; + + public String getDeviceStateName() { + if (useState.equals("1")){ + return "使用中"; + }else if (deviceState.equals("0")){ + return "停用"; + }else if (deviceState.equals("1")){ + return "正常"; + }else if (deviceState.equals("2")){ + return "维修"; + } + + return deviceStateName; + } + + public void setDeviceState(String deviceState) { + this.deviceState = deviceState; + } + + public String getLocationName() { + return locationName; + } + + public void setLocationName(String locationName) { + this.locationName = locationName; + } + + public String getOpenPassword() { + return openPassword; + } + + public void setOpenPassword(String openPassword) { + this.openPassword = openPassword; + } + +} diff --git a/app/src/main/java/com/example/beijingnopowercon/data/LoginUser.java b/app/src/main/java/com/example/beijingnopowercon/data/LoginUser.java new file mode 100644 index 0000000..7fa6e5f --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/data/LoginUser.java @@ -0,0 +1,24 @@ +package com.example.beijingnopowercon.data; + +public class LoginUser { + private Long userId; + + + private Long deptId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/data/LoginVm.java b/app/src/main/java/com/example/beijingnopowercon/data/LoginVm.java new file mode 100644 index 0000000..09f7774 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/data/LoginVm.java @@ -0,0 +1,40 @@ +package com.example.beijingnopowercon.data; + +import androidx.databinding.BaseObservable; + +/** + * @author wanghao + * @date 2023/12/21 14:00 + */ +public class LoginVm extends BaseObservable { + private String name; + private String pass; + private boolean remember; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + notifyChange(); + } + + public String getPass() { + return pass; + } + + public void setPass(String pass) { + this.pass = pass; + notifyChange(); + } + + public boolean isRemember() { + return remember; + } + + public void setRemember(boolean remember) { + this.remember = remember; + notifyChange(); + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/dialog/LoadDialog.java b/app/src/main/java/com/example/beijingnopowercon/dialog/LoadDialog.java new file mode 100644 index 0000000..eedc2ee --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/dialog/LoadDialog.java @@ -0,0 +1,19 @@ +package com.example.beijingnopowercon.dialog; + +import android.app.ProgressDialog; +import android.content.Context; +import android.view.Window; + +public class LoadDialog extends ProgressDialog { + + + public LoadDialog(Context context) { + super(context); + this.requestWindowFeature(Window.FEATURE_NO_TITLE); + this.setCanceledOnTouchOutside(false); + this.setProgressStyle(ProgressDialog.STYLE_SPINNER); + this.setMessage("请求网络..."); + } + + +} diff --git a/app/src/main/java/com/example/beijingnopowercon/dialog/SanInfoDialog.java b/app/src/main/java/com/example/beijingnopowercon/dialog/SanInfoDialog.java new file mode 100644 index 0000000..a4656e4 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/dialog/SanInfoDialog.java @@ -0,0 +1,56 @@ +package com.example.beijingnopowercon.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.Window; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; + +import com.example.beijingnopowercon.R; +import com.example.beijingnopowercon.data.DeviceInfo; +import com.example.beijingnopowercon.databinding.DialogDeviceInfoBinding; + +public class SanInfoDialog extends Dialog { + + private DeviceInfo deviceInfo; + private SanInfoDialogCall call; + + public void setCall(SanInfoDialogCall call) { + this.call = call; + } + + public void setDeviceInfo(DeviceInfo deviceInfo) { + this.deviceInfo = deviceInfo; + } + private DialogDeviceInfoBinding binding; + public SanInfoDialog(@NonNull Context context) { + super(context,R.style.dialog); + binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_device_info, null, false); + setContentView(binding.getRoot()); + binding.dialogClose.setOnClickListener(v -> dismiss()); + binding.dialogButtonOpen.setOnClickListener(v -> call.openDeviceLockRequest(deviceInfo)); + // 获取 Window 对象并设置属性 + Window window = this.getWindow(); + window.setGravity(Gravity.BOTTOM); // 设置在底部 + + + } + + + + public interface SanInfoDialogCall{ + void openDeviceLockRequest(DeviceInfo deviceInfo); + } + + @Override + public void show() { + super.show(); + Log.e("TAG", "show:" +123); + binding.setData(deviceInfo); + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/okgo/MyRecultCall.java b/app/src/main/java/com/example/beijingnopowercon/okgo/MyRecultCall.java new file mode 100644 index 0000000..b164eb4 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/okgo/MyRecultCall.java @@ -0,0 +1,68 @@ +package com.example.beijingnopowercon.okgo; + +import android.app.ProgressDialog; +import android.content.Context; +import android.util.Log; +import android.widget.Toast; + +import com.google.gson.Gson; +import com.lzy.okgo.callback.AbsCallback; +import com.lzy.okgo.model.Response; +import com.lzy.okgo.request.base.Request; + +import okhttp3.ResponseBody; + +/** + * @author wanghao + * @date 2023/11/20 14:27 + */ +public abstract class MyRecultCall extends AbsCallback { + private ProgressDialog dialog; + private Context context; + + public MyRecultCall(ProgressDialog dialog, Context context) { + this.dialog = dialog; + this.context = context; + } + @Override + public void onSuccess(Response response) { + dialog.dismiss(); + // Log.e("网络请求情况", "onSuccess:"); + } + @Override + public MyResult convertResponse(okhttp3.Response response) throws Throwable { + ResponseBody body = response.body(); + if (body == null) return null; + Gson gson = new Gson(); + MyResult resust = gson.fromJson(body.string(), MyResult.class); + resust.setDataJson(gson.toJson(resust.getData())); + return resust; + } + + + + + + @Override + public void onError(Response response) { + super.onError(response); + dialog.dismiss(); + Log.e("网络请求情况", "onError:" ); + Toast.makeText(context, "网络连接错误", Toast.LENGTH_LONG).show(); + + } + + @Override + public void onStart(Request request) { + super.onStart(request); + dialog.show(); + // Log.e("网络请求情况", "onStart:" ); + } + + @Override + public void onFinish() { + super.onFinish(); + dialog.dismiss(); + Log.e("网络请求情况", "onFinish:" ); + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/okgo/MyResult.java b/app/src/main/java/com/example/beijingnopowercon/okgo/MyResult.java new file mode 100644 index 0000000..349430d --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/okgo/MyResult.java @@ -0,0 +1,44 @@ +package com.example.beijingnopowercon.okgo; + +/** + * @author wanghao + * @date 2023/12/21 15:31 + */ +public class MyResult { + private int code; + private String msg; + private Object data; + private String dataJson; + + 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 Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getDataJson() { + return dataJson; + } + + public void setDataJson(String dataJson) { + this.dataJson = dataJson; + } +} diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java b/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java new file mode 100644 index 0000000..223418f --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryFragment.java @@ -0,0 +1,37 @@ +package com.example.beijingnopowercon.ui.gallery; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; + +import com.example.beijingnopowercon.databinding.FragmentGalleryBinding; + +public class GalleryFragment extends Fragment { + + private FragmentGalleryBinding binding; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + GalleryViewModel galleryViewModel = + new ViewModelProvider(this).get(GalleryViewModel.class); + + binding = FragmentGalleryBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + final TextView textView = binding.textGallery; + galleryViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); + return root; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryViewModel.java b/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryViewModel.java new file mode 100644 index 0000000..8638523 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/ui/gallery/GalleryViewModel.java @@ -0,0 +1,19 @@ +package com.example.beijingnopowercon.ui.gallery; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class GalleryViewModel extends ViewModel { + + private final MutableLiveData mText; + + public GalleryViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is gallery fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java b/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java new file mode 100644 index 0000000..4f9fedc --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeFragment.java @@ -0,0 +1,115 @@ +package com.example.beijingnopowercon.ui.home; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; + +import com.example.beijingnopowercon.CustomScannerActivity; +import com.example.beijingnopowercon.base.BaseFragment; +import com.example.beijingnopowercon.data.DeviceInfo; +import com.example.beijingnopowercon.databinding.FragmentHomeBinding; +import com.example.beijingnopowercon.dialog.SanInfoDialog; +import com.example.beijingnopowercon.okgo.MyRecultCall; +import com.example.beijingnopowercon.okgo.MyResult; +import com.example.beijingnopowercon.uitls.SharedPreferencesUtils; +import com.google.android.material.snackbar.Snackbar; +import com.google.gson.Gson; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.Response; + +import okhttp3.MediaType; +import okhttp3.RequestBody; + +public class HomeFragment extends BaseFragment implements SanInfoDialog.SanInfoDialogCall{ + private View root; + private FragmentHomeBinding binding; + private SanInfoDialog infoDialog; + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentHomeBinding.inflate(inflater, container, false); + root = binding.getRoot(); + binding.homeSan.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), CustomScannerActivity.class); + startActivityForResult(intent, IntentIntegrator.REQUEST_CODE); + }); + infoDialog=new SanInfoDialog(context); + infoDialog.setCall(this); + Log.e("TAG", "onCreateView:"); + return root; + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == IntentIntegrator.REQUEST_CODE) { + IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); + if (result != null) { + if (result.getContents() == null) { + Snackbar.make(root, "扫描取消", Snackbar.LENGTH_LONG).show(); + } else { + // Toast.makeText(context, "扫描成功", Toast.LENGTH_SHORT).show(); + selectDeviceInfo(result.getContents()); + } + } + } + } + + // 查询设备 + private void selectDeviceInfo(String code) { + OkGo.post(url + "/home/selectDeviceInfo").params("code", code) + .execute(new MyRecultCall(dialog, context) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode()==0){ + DeviceInfo deviceInfo= gson.fromJson(body.getDataJson(), DeviceInfo.class); + Log.e("TAG", "onSuccess:请求成功" ); + infoDialog.setDeviceInfo(deviceInfo); + infoDialog.show(); + return; + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + }); + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } + + + @Override + public void openDeviceLockRequest(DeviceInfo deviceInfo) { + deviceInfo.setUserId(SharedPreferencesUtils.getLong("userId",0L)); + deviceInfo.setDeptId(SharedPreferencesUtils.getLong("deptId",0L)); + deviceInfo.setUseUser(SharedPreferencesUtils.getstring("user",null)); + OkGo.post(url + "/home/openDeviceLock") + .upRequestBody(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), + gson.toJson(deviceInfo))) + .execute(new MyRecultCall(dialog, context) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + MyResult body = response.body(); + if (body.getCode()==0){ + Toast.makeText(context, "开锁成功", Toast.LENGTH_SHORT).show(); + infoDialog.dismiss(); + return; + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_LONG).show(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeViewModel.java b/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeViewModel.java new file mode 100644 index 0000000..81ccbbc --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/ui/home/HomeViewModel.java @@ -0,0 +1,19 @@ +package com.example.beijingnopowercon.ui.home; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + private final MutableLiveData mText; + + public HomeViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is home fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/slideshow/SlideshowFragment.java b/app/src/main/java/com/example/beijingnopowercon/ui/slideshow/SlideshowFragment.java new file mode 100644 index 0000000..f7c4cf8 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/ui/slideshow/SlideshowFragment.java @@ -0,0 +1,37 @@ +package com.example.beijingnopowercon.ui.slideshow; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; + +import com.example.beijingnopowercon.databinding.FragmentSlideshowBinding; + +public class SlideshowFragment extends Fragment { + + private FragmentSlideshowBinding binding; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + SlideshowViewModel slideshowViewModel = + new ViewModelProvider(this).get(SlideshowViewModel.class); + + binding = FragmentSlideshowBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + final TextView textView = binding.textSlideshow; + slideshowViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); + return root; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/ui/slideshow/SlideshowViewModel.java b/app/src/main/java/com/example/beijingnopowercon/ui/slideshow/SlideshowViewModel.java new file mode 100644 index 0000000..ab77d42 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/ui/slideshow/SlideshowViewModel.java @@ -0,0 +1,19 @@ +package com.example.beijingnopowercon.ui.slideshow; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class SlideshowViewModel extends ViewModel { + + private final MutableLiveData mText; + + public SlideshowViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is slideshow fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijingnopowercon/uitls/SharedPreferencesUtils.java b/app/src/main/java/com/example/beijingnopowercon/uitls/SharedPreferencesUtils.java new file mode 100644 index 0000000..494bd40 --- /dev/null +++ b/app/src/main/java/com/example/beijingnopowercon/uitls/SharedPreferencesUtils.java @@ -0,0 +1,103 @@ +package com.example.beijingnopowercon.uitls; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * Created by wang 18/7/5 + */ + +public class SharedPreferencesUtils { + private static SharedPreferences sharedPreferences; + private static SharedPreferences.Editor edit; + + public static void init(Context context, String name) { + sharedPreferences = context.getSharedPreferences(name, context.MODE_PRIVATE); + edit = sharedPreferences.edit(); + edit.commit(); + } + + public static void putstring(String key, String value) { + if (edit != null) { + edit.putString(key, value); + edit.commit(); + } + } + + public static void putLong(String key, Long value) { + if (edit != null) { + edit.putLong(key, value); + edit.commit(); + } + } + + + public static void putInt(String key, int value) { + if (edit != null) { + edit.putInt(key, value); + edit.commit(); + } + } + + public static int getInt(String key, int value) { + if (sharedPreferences != null) { + return sharedPreferences.getInt(key, value); + } + return 0; + } + + public static long getLong(String key, long value) { + if (sharedPreferences != null) { + return sharedPreferences.getLong(key, value); + } + return 0L; + } + + + public static void putboolean(String key, boolean value) { + if (edit != null) { + edit.putBoolean(key, value); + edit.commit(); + } + } + + /** + * 取得方法 + */ + + public static String getstring(String key, String deaflut) { + if (sharedPreferences != null) { + return sharedPreferences.getString(key, deaflut); + } + return ""; + } + + public static boolean getboolean(String key, boolean aaa) { + if (sharedPreferences != null) { + boolean aBoolean = sharedPreferences.getBoolean(key, aaa); + return aBoolean; + } + return aaa; + } + + /** + * remo + */ + public static void removeKey(String key) { + if (edit != null) { + edit.remove(key); + edit.commit(); + } + } + + public static void Clean() { + // 清空数据 + try { + edit.clear(); + edit.commit(); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/app/src/main/res/anim/dialog_in.xml b/app/src/main/res/anim/dialog_in.xml new file mode 100644 index 0000000..c0f84b4 --- /dev/null +++ b/app/src/main/res/anim/dialog_in.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/dialog_out.xml b/app/src/main/res/anim/dialog_out.xml new file mode 100644 index 0000000..b884212 --- /dev/null +++ b/app/src/main/res/anim/dialog_out.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_top_radius.xml b/app/src/main/res/drawable/bg_top_radius.xml new file mode 100644 index 0000000..ad8b0e9 --- /dev/null +++ b/app/src/main/res/drawable/bg_top_radius.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_flashlight.xml b/app/src/main/res/drawable/ic_flashlight.xml new file mode 100644 index 0000000..9b50b54 --- /dev/null +++ b/app/src/main/res/drawable/ic_flashlight.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_menu_home.xml b/app/src/main/res/drawable/ic_menu_home.xml new file mode 100644 index 0000000..8f84923 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_home.xml @@ -0,0 +1,54 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_menu_record.xml b/app/src/main/res/drawable/ic_menu_record.xml new file mode 100644 index 0000000..b524ee4 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_record.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml new file mode 100644 index 0000000..5e9e163 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/scan_frame.xml b/app/src/main/res/drawable/scan_frame.xml new file mode 100644 index 0000000..0e991e1 --- /dev/null +++ b/app/src/main/res/drawable/scan_frame.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/scan_line.xml b/app/src/main/res/drawable/scan_line.xml new file mode 100644 index 0000000..e93f046 --- /dev/null +++ b/app/src/main/res/drawable/scan_line.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..cd08d16 --- /dev/null +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_custom_scanner.xml b/app/src/main/res/layout/activity_custom_scanner.xml new file mode 100644 index 0000000..7b01e65 --- /dev/null +++ b/app/src/main/res/layout/activity_custom_scanner.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ 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..93a5364 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +