diff --git a/FLower/.gitignore b/FLower/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/FLower/.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/FLower/.idea/.gitignore b/FLower/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/FLower/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/FLower/.idea/.name b/FLower/.idea/.name
new file mode 100644
index 0000000..5706f0a
--- /dev/null
+++ b/FLower/.idea/.name
@@ -0,0 +1 @@
+Flower
\ No newline at end of file
diff --git a/FLower/.idea/compiler.xml b/FLower/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/FLower/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/.idea/gradle.xml b/FLower/.idea/gradle.xml
new file mode 100644
index 0000000..a2d7c21
--- /dev/null
+++ b/FLower/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/.idea/jarRepositories.xml b/FLower/.idea/jarRepositories.xml
new file mode 100644
index 0000000..a5f05cd
--- /dev/null
+++ b/FLower/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/.idea/misc.xml b/FLower/.idea/misc.xml
new file mode 100644
index 0000000..bdd9278
--- /dev/null
+++ b/FLower/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/.gitignore b/FLower/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/FLower/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/FLower/app/build.gradle b/FLower/app/build.gradle
new file mode 100644
index 0000000..5e30ab0
--- /dev/null
+++ b/FLower/app/build.gradle
@@ -0,0 +1,51 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ compileSdkVersion 30
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.example.food"
+ minSdkVersion 16
+ targetSdkVersion 30
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ //litepal
+ implementation 'org.litepal.android:core:1.6.1'
+ //glide图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.11.0'
+ //recyclerview
+ implementation 'androidx.recyclerview:recyclerview:1.1.0'
+ compile 'com.google.code.gson:gson:2.7'
+ //网络请求
+ implementation 'com.squareup.okhttp3:okhttp:4.4.0'
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.4.0'
+ implementation 'com.zhy:okhttputils:2.0.0' //glide图片加载框架
+ implementation 'com.github.bumptech.glide:glide:3.6.1'
+}
\ No newline at end of file
diff --git a/FLower/app/proguard-rules.pro b/FLower/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/FLower/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/FLower/app/src/androidTest/java/com/example/Flower/ExampleInstrumentedTest.java b/FLower/app/src/androidTest/java/com/example/Flower/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..b6a379c
--- /dev/null
+++ b/FLower/app/src/androidTest/java/com/example/Flower/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.Flower;
+
+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.food", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/FLower/app/src/main/AndroidManifest.xml b/FLower/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..eff394f
--- /dev/null
+++ b/FLower/app/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/assets/db.json b/FLower/app/src/main/assets/db.json
new file mode 100644
index 0000000..e69de29
diff --git a/FLower/app/src/main/assets/litepal.xml b/FLower/app/src/main/assets/litepal.xml
new file mode 100644
index 0000000..84589a5
--- /dev/null
+++ b/FLower/app/src/main/assets/litepal.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/java/com/example/Flower/MyApplication.java b/FLower/app/src/main/java/com/example/Flower/MyApplication.java
new file mode 100644
index 0000000..216a0c0
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/MyApplication.java
@@ -0,0 +1,25 @@
+package com.example.Flower;
+
+import android.app.Activity;
+import android.app.Application;
+
+import org.litepal.LitePal;
+
+public class MyApplication extends Application {
+ public static MyApplication Instance;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Instance = this;
+ LitePal.initialize(this);//初始化LitePal数据库
+ }
+ private Activity mMainActivity;
+
+ public Activity getMainActivity() {
+ return mMainActivity;
+ }
+
+ public void setMainActivity(Activity mainActivity) {
+ mMainActivity = mainActivity;
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/adapter/BrowseAdapter.java b/FLower/app/src/main/java/com/example/Flower/adapter/BrowseAdapter.java
new file mode 100644
index 0000000..de6a80d
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/adapter/BrowseAdapter.java
@@ -0,0 +1,83 @@
+package com.example.Flower.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.Browse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 浏览记录适配器
+ */
+
+public class BrowseAdapter extends RecyclerView.Adapter {
+ private List list =new ArrayList<>();
+ private Context mActivity;
+ private ItemListener mItemListener;
+ private LinearLayout llEmpty;
+ private RecyclerView rvNewsList;
+ public void setItemListener(ItemListener itemListener){
+ this.mItemListener = itemListener;
+ }
+ public BrowseAdapter(LinearLayout llEmpty, RecyclerView rvNewsList){
+ this.llEmpty = llEmpty;
+ this.rvNewsList =rvNewsList;
+ }
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ mActivity = viewGroup.getContext();
+ View view= LayoutInflater.from(mActivity).inflate(R.layout.item_rv_collect_list,viewGroup,false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
+ Browse browse = list.get(i);
+ if (browse != null) {
+ viewHolder.title.setText(browse.getTitle());
+ viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mItemListener!=null){
+ mItemListener.ItemClick(browse);
+ }
+ }
+ });
+ }
+ }
+ public void addItem(List listAdd) {
+ //如果是加载第一页,需要先清空数据列表
+ this.list.clear();
+ if (listAdd!=null){
+ //添加数据
+ this.list.addAll(listAdd);
+ }
+ //通知RecyclerView进行改变--整体
+ notifyDataSetChanged();
+ }
+ @Override
+ public int getItemCount() {
+ return list.size();
+ }
+ public class ViewHolder extends RecyclerView.ViewHolder {
+ private TextView title;
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ title = itemView.findViewById(R.id.title);
+ }
+ }
+ public interface ItemListener{
+ void ItemClick(Browse browse);
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/adapter/FruitAdapter.java b/FLower/app/src/main/java/com/example/Flower/adapter/FruitAdapter.java
new file mode 100644
index 0000000..2c4a833
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/adapter/FruitAdapter.java
@@ -0,0 +1,138 @@
+package com.example.Flower.adapter;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.example.Flower.R;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.util.SPUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class FruitAdapter extends RecyclerView.Adapter {
+ private List list =new ArrayList<>();
+ private Context mActivity;
+ private ItemListener mItemListener;
+ private LinearLayout llEmpty;
+ private RecyclerView rvfruitList;
+ public void setItemListener(ItemListener itemListener){
+ this.mItemListener = itemListener;
+ }
+ public FruitAdapter(LinearLayout llEmpty, RecyclerView rvfruitList){
+ this.llEmpty = llEmpty;
+ this.rvfruitList =rvfruitList;
+ }
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ mActivity = viewGroup.getContext();
+ View view= LayoutInflater.from(mActivity).inflate(R.layout.item_rv_fruit_list,viewGroup,false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
+ Fruit fruit = list.get(i);
+ if (fruit != null) {
+ viewHolder.title.setText(fruit.getTitle());
+ viewHolder.author_name.setText(String.format("¥ %s",fruit.getIssuer()));
+ viewHolder.date.setText(fruit.getDate());
+ Glide.with(mActivity)
+ .asBitmap()
+ .load(fruit.getImg())
+ .error(R.drawable.ic_error)
+ .skipMemoryCache(true)
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .into(viewHolder.img);
+ Boolean isAdmin = (Boolean) SPUtils.get(mActivity,SPUtils.IS_ADMIN,false);
+ viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mItemListener!=null){
+ mItemListener.ItemClick(fruit);
+ }
+ }
+ });
+ if (isAdmin){
+ viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity);
+ dialog.setMessage("确认要删除该花吗");
+ dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ list.remove(fruit);
+ fruit.delete();
+ notifyDataSetChanged();
+ Toast.makeText(mActivity,"删除成功", Toast.LENGTH_LONG).show();
+ if (list!=null && list.size() > 0){
+ rvfruitList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ }else {
+ rvfruitList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ dialog.setNeutralButton("取消", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ return false;
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return list.size();
+ }
+ public void addItem(List listAdd) {
+ //如果是加载第一页,需要先清空数据列表
+ this.list.clear();
+ if (listAdd!=null){
+ //添加数据
+ this.list.addAll(listAdd);
+ }
+ //通知RecyclerView进行改变--整体
+ notifyDataSetChanged();
+ }
+ public class ViewHolder extends RecyclerView.ViewHolder {
+ private TextView title;
+ private TextView author_name;
+ private TextView date;
+ private ImageView img;
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ title = itemView.findViewById(R.id.title);
+ author_name = itemView.findViewById(R.id.author_name);
+ date = itemView.findViewById(R.id.date);
+ img = itemView.findViewById(R.id.img);
+ }
+ }
+
+ public interface ItemListener{
+ void ItemClick(Fruit fruit);
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/adapter/OrderAdapter.java b/FLower/app/src/main/java/com/example/Flower/adapter/OrderAdapter.java
new file mode 100644
index 0000000..0523997
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/adapter/OrderAdapter.java
@@ -0,0 +1,134 @@
+package com.example.Flower.adapter;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.request.RequestOptions;
+import com.example.Flower.R;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.bean.Orders;
+import com.example.Flower.bean.User;
+import com.example.Flower.ui.activity.FruitDetailActivity;
+import com.example.Flower.util.SPUtils;
+
+import org.litepal.crud.DataSupport;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class OrderAdapter extends RecyclerView.Adapter {
+ private List list =new ArrayList<>();
+ private Context mActivity;
+ private RequestOptions headerRO = new RequestOptions().circleCrop();//圆角变换
+ private LinearLayout llEmpty;
+ private RecyclerView rvOrderList;
+ private ItemListener mItemListener;
+ public void setItemListener(ItemListener itemListener){
+ this.mItemListener = itemListener;
+ }
+ public OrderAdapter(LinearLayout llEmpty, RecyclerView rvOrderList){
+ this.llEmpty = llEmpty;
+ this.rvOrderList =rvOrderList;
+ }
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ mActivity = viewGroup.getContext();
+ View view= LayoutInflater.from(mActivity).inflate(R.layout.item_rv_order_list,viewGroup,false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
+ Orders order = list.get(i);
+ User user = DataSupport.where("account = ? ", order.getAccount()).findFirst(User.class);
+ if (order != null && user!=null) {
+ viewHolder.nickName.setText(String.format("用户:%s",user.getNickName()));
+ viewHolder.number.setText(order.getNumber());
+ viewHolder.date.setText(order.getDate());
+ viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(mActivity, FruitDetailActivity.class);
+ Fruit fruit = DataSupport.where("title = ?",order.getTitle()).findFirst(Fruit.class);
+ intent.putExtra("fruit",fruit);
+ mActivity.startActivity(intent);
+ }
+ });
+ Boolean isAdmin = (Boolean) SPUtils.get(mActivity,SPUtils.IS_ADMIN,false);
+ if (isAdmin){
+ viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity);
+ dialog.setMessage("确认要删除该订单吗");
+ dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ list.remove(order);
+ order.delete();
+ notifyDataSetChanged();
+ Toast.makeText(mActivity,"删除成功", Toast.LENGTH_LONG).show();
+ if (list!=null && list.size() > 0){
+ rvOrderList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ }else {
+ rvOrderList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ dialog.setNeutralButton("取消", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ return false;
+ }
+ });
+ }
+ }
+ }
+ public void addItem(List listAdd) {
+ //如果是加载第一页,需要先清空数据列表
+ this.list.clear();
+ if (listAdd!=null){
+ //添加数据
+ this.list.addAll(listAdd);
+ }
+ //通知RecyclerView进行改变--整体
+ notifyDataSetChanged();
+ }
+ @Override
+ public int getItemCount() {
+ return list.size();
+ }
+ public class ViewHolder extends RecyclerView.ViewHolder {
+ private TextView nickName;
+ private TextView date;
+ private TextView number;
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ nickName = itemView.findViewById(R.id.nickName);
+ date = itemView.findViewById(R.id.date);
+ number = itemView.findViewById(R.id.number);
+ }
+ }
+ public interface ItemListener{
+ void ItemClick(Orders order);
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/adapter/UserAdapter.java b/FLower/app/src/main/java/com/example/Flower/adapter/UserAdapter.java
new file mode 100644
index 0000000..bfdea06
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/adapter/UserAdapter.java
@@ -0,0 +1,123 @@
+package com.example.Flower.adapter;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.Browse;
+import com.example.Flower.bean.User;
+import com.example.Flower.ui.activity.UserDetailActivity;
+import com.example.Flower.util.SPUtils;
+
+import org.litepal.crud.DataSupport;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class UserAdapter extends RecyclerView.Adapter {
+ private List list =new ArrayList<>();
+ private Context mActivity;
+ private LinearLayout llEmpty;
+ private RecyclerView rvUserList;
+
+ public UserAdapter(LinearLayout llEmpty, RecyclerView rvUserList){
+ this.llEmpty = llEmpty;
+ this.rvUserList =rvUserList;
+ }
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ mActivity = viewGroup.getContext();
+ View view= LayoutInflater.from(mActivity).inflate(R.layout.item_rv_user_list,viewGroup,false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
+ User user = list.get(i);
+ if (user!=null) {
+ String account = (String) SPUtils.get(mActivity,SPUtils.ACCOUNT,"");
+ viewHolder.itemView.setVisibility(account.equals(user.getAccount())? View.GONE: View.VISIBLE);
+ viewHolder.nickName.setText(user.getNickName());
+ viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(mActivity, UserDetailActivity.class);
+ intent.putExtra("user",user);
+ mActivity.startActivity(intent);
+ }
+ });
+ viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity);
+ dialog.setMessage("确认要删除该用户吗");
+ dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ //删除收藏记录和浏览记录
+ List browses = DataSupport.where("account = ?",user.getAccount()).find(Browse.class);
+ if (browses !=null && browses.size() > 0){
+ for (Browse browse: browses) {
+ browse.delete();
+ }
+ }
+ list.remove(user);
+ user.delete();
+ notifyDataSetChanged();
+ Toast.makeText(mActivity,"删除成功", Toast.LENGTH_LONG).show();
+ if (list!=null && list.size() > 1){
+ rvUserList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ }else {
+ rvUserList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ dialog.setNeutralButton("取消", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ return false;
+ }
+ });
+ }
+ }
+ public void addItem(List listAdd) {
+ //如果是加载第一页,需要先清空数据列表
+ this.list.clear();
+ if (listAdd!=null){
+ //添加数据
+ this.list.addAll(listAdd);
+ }
+ //通知RecyclerView进行改变--整体
+ notifyDataSetChanged();
+ }
+ @Override
+ public int getItemCount() {
+ return list.size();
+ }
+ public class ViewHolder extends RecyclerView.ViewHolder {
+ private TextView nickName;
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ nickName = itemView.findViewById(R.id.nickName);
+ }
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/bean/Browse.java b/FLower/app/src/main/java/com/example/Flower/bean/Browse.java
new file mode 100644
index 0000000..bef4c95
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/bean/Browse.java
@@ -0,0 +1,33 @@
+package com.example.Flower.bean;
+
+import org.litepal.crud.DataSupport;
+
+
+/**
+ * 浏览记录
+ */
+public class Browse extends DataSupport {
+ private String account;//账号
+ private String title;//菜品标题
+
+ public String getAccount() {
+ return account;
+ }
+
+ public void setAccount(String account) {
+ this.account = account;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public Browse(String account, String title) {
+ this.account = account;
+ this.title = title;
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/bean/Fruit.java b/FLower/app/src/main/java/com/example/Flower/bean/Fruit.java
new file mode 100644
index 0000000..4b59f43
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/bean/Fruit.java
@@ -0,0 +1,75 @@
+package com.example.Flower.bean;
+
+import org.litepal.crud.DataSupport;
+
+import java.io.Serializable;
+
+
+/**
+ * 菜品
+ */
+public class Fruit extends DataSupport implements Serializable {
+ private Integer typeId;//类型 0科技,1娱乐,2体育,3军事,4汽车,5健康
+ private String title;//标题
+ private String img;//图片
+ private String content;//内容
+ private String issuer;//发布人
+ private String date;//时间
+
+ public Integer getTypeId() {
+ return typeId;
+ }
+
+ public void setTypeId(Integer typeId) {
+ this.typeId = typeId;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getImg() {
+ return img;
+ }
+
+ public void setImg(String img) {
+ this.img = img;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getDate() {
+ return date;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public String getIssuer() {
+ return issuer;
+ }
+
+ public void setIssuer(String issuer) {
+ this.issuer = issuer;
+ }
+
+ public Fruit(Integer typeId, String title, String img, String content, String issuer, String date) {
+ this.typeId = typeId;
+ this.title = title;
+ this.img = img;
+ this.content = content;
+ this.issuer = issuer;
+ this.date = date;
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/bean/Orders.java b/FLower/app/src/main/java/com/example/Flower/bean/Orders.java
new file mode 100644
index 0000000..8086577
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/bean/Orders.java
@@ -0,0 +1,62 @@
+package com.example.Flower.bean;
+
+import org.litepal.crud.DataSupport;
+
+import java.io.Serializable;
+
+public class Orders extends DataSupport implements Serializable {
+ private String account;//账号
+ private String title;//标题
+ private String number;//编号
+ private String amount;//数量
+ private String date;//时间
+
+
+ public String getAccount() {
+ return account;
+ }
+
+ public void setAccount(String account) {
+ this.account = account;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+
+ public String getAmount() {
+ return amount;
+ }
+
+ public void setAmount(String amount) {
+ this.amount = amount;
+ }
+
+ public String getDate() {
+ return date;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public Orders(String account, String title, String number, String amount, String date) {
+ this.account = account;
+ this.title = title;
+ this.number = number;
+ this.amount = amount;
+ this.date = date;
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/bean/User.java b/FLower/app/src/main/java/com/example/Flower/bean/User.java
new file mode 100644
index 0000000..569a2af
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/bean/User.java
@@ -0,0 +1,66 @@
+package com.example.Flower.bean;
+
+import org.litepal.crud.DataSupport;
+
+import java.io.Serializable;
+
+
+/**
+ * 用户
+ */
+public class User extends DataSupport implements Serializable {
+ private String account;//账号
+ private String password;//密码
+ private String nickName;//昵称
+ private Integer age;//年龄
+ private String email;//邮箱
+
+ public String getAccount() {
+ return account;
+ }
+
+ public void setAccount(String account) {
+ this.account = account;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getNickName() {
+ return nickName;
+ }
+
+ public void setNickName(String nickName) {
+ this.nickName = nickName;
+ }
+
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public User(String account, String password, String nickName, Integer age, String email) {
+ this.account = account;
+ this.password = password;
+ this.nickName = nickName;
+ this.age = age;
+ this.email = email;
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/AddFruitActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/AddFruitActivity.java
new file mode 100644
index 0000000..efa6507
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/AddFruitActivity.java
@@ -0,0 +1,132 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.example.Flower.R;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+/**
+ * 添加页面
+ */
+public class AddFruitActivity extends AppCompatActivity {
+ private ActionBar mActionBar;//标题栏
+ private Activity myActivity;
+ private EditText etTitle;//标题
+ private EditText etIssuer;//发布单位
+ private EditText etImg;//图片
+ private Spinner spType;//类型
+ private EditText etContent;//内容
+ private ImageView ivImg;//图片
+ SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ private Fruit mfruit;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ myActivity = this;
+ setContentView(R.layout.activity_fruit_add);
+ etTitle = findViewById(R.id.title);
+ etIssuer = findViewById(R.id.issuer);
+ spType = findViewById(R.id.type);
+ etImg = findViewById(R.id.img);
+ etContent = findViewById(R.id.content);
+ ivImg = findViewById(R.id.iv_img);
+ mActionBar = findViewById(R.id.myActionBar);
+ //侧滑菜单
+ mActionBar.setData(myActivity,"编辑花的信息", R.drawable.ic_back, 0, 0, getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ initView();
+ }
+
+ private void initView() {
+ mfruit = (Fruit) getIntent().getSerializableExtra("fruit");
+ if (mfruit !=null){
+ etTitle.setText(mfruit.getTitle());
+ spType.setSelection(mfruit.getTypeId());
+ etImg.setText(mfruit.getImg());
+ etIssuer.setText(mfruit.getIssuer());
+ etContent.setText(mfruit.getContent());
+ spType.setSelection(mfruit.getTypeId(),true);
+ Glide.with(myActivity)
+ .asBitmap()
+ .load(mfruit.getImg())
+ .error(R.drawable.ic_error)
+ .skipMemoryCache(true)
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .into(ivImg);
+ }
+ ivImg.setVisibility(mfruit ==null? View.GONE: View.VISIBLE);
+ }
+
+ public void save(View view){
+ String title = etTitle.getText().toString();
+ String issuer = etIssuer.getText().toString();
+ String img = etImg.getText().toString();
+ String content = etContent.getText().toString();
+ Integer typeId = spType.getSelectedItemPosition();
+ if ("".equals(title)) {
+ Toast.makeText(myActivity,"花名不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(issuer)) {
+ Toast.makeText(myActivity,"价格不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(img)) {
+ Toast.makeText(myActivity,"图片地址不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(content)) {
+ Toast.makeText(myActivity,"描述不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ Fruit fruit = null;
+ if (!title.equals(mfruit != null? mfruit.getTitle():"")){
+ fruit = DataSupport.where("title = ?",title).findFirst(Fruit.class);
+ }
+ if (fruit == null ){
+ if (mfruit != null){
+ fruit = DataSupport.where("title = ?", mfruit.getTitle()).findFirst(Fruit.class);
+ fruit.setTypeId(typeId);
+ fruit.setTitle(title);
+ fruit.setIssuer(issuer);
+ fruit.setImg(img);
+ fruit.setContent(content);
+ }else {
+ fruit = new Fruit(typeId,title,img,content,issuer,sf.format(new Date()));
+ }
+ fruit.save();
+ setResult(RESULT_OK);
+ finish();
+ Toast.makeText(myActivity,"保存成功", Toast.LENGTH_LONG).show();
+ }else {
+ Toast.makeText(myActivity,"该花名已存在", Toast.LENGTH_LONG).show();
+ }
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/BrowseActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/BrowseActivity.java
new file mode 100644
index 0000000..48a61cb
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/BrowseActivity.java
@@ -0,0 +1,101 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.Flower.R;
+import com.example.Flower.adapter.BrowseAdapter;
+import com.example.Flower.bean.Browse;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.util.SPUtils;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+import java.util.List;
+
+
+/**
+ * 浏览记录
+ */
+public class BrowseActivity extends AppCompatActivity {
+ private Activity myActivity;
+ private ActionBar mTitleBar;//标题栏
+ private LinearLayout llEmpty;
+ private RecyclerView rvBrowseList;
+ private BrowseAdapter mBrowseAdapter;
+ private List mBrowses;
+ private String account;
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_browse);
+ myActivity = this;
+ rvBrowseList = findViewById(R.id.rv_collect_list);
+ llEmpty = findViewById(R.id.ll_empty);
+ mTitleBar = (ActionBar)findViewById(R.id.myActionBar);
+ mTitleBar.setData(myActivity,"浏览记录", R.drawable.ic_back, 0, 0,getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ initView();
+ }
+
+ private void initView() {
+ account = (String) SPUtils.get(myActivity,SPUtils.ACCOUNT,"");
+ LinearLayoutManager layoutManager=new LinearLayoutManager(myActivity);
+ //=1.2、设置为垂直排列,用setOrientation方法设置(默认为垂直布局)
+ layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ //=1.3、设置recyclerView的布局管理器
+ rvBrowseList.setLayoutManager(layoutManager);
+ //==2、实例化适配器
+ //=2.1、初始化适配器
+ mBrowseAdapter=new BrowseAdapter(llEmpty,rvBrowseList);
+ //=2.3、设置recyclerView的适配器
+ rvBrowseList.setAdapter(mBrowseAdapter);
+ loadData();//加载数据
+ mBrowseAdapter.setItemListener(new BrowseAdapter.ItemListener() {
+ @Override
+ public void ItemClick(Browse collect) {
+ Intent intent = new Intent(myActivity, FruitDetailActivity.class);;
+ Fruit news = DataSupport.where("title = ?",collect.getTitle()).findFirst(Fruit.class);
+ intent.putExtra("fruit",news);
+ startActivityForResult(intent,100);
+ }
+ });
+ }
+
+ /**
+ * 加载数据
+ */
+ private void loadData(){
+ mBrowses = DataSupport.where("account = ?",account).find(Browse.class);//查询浏览记录
+ if (mBrowses !=null && mBrowses.size()>0){
+ rvBrowseList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ mBrowseAdapter.addItem(mBrowses);
+ }else {
+ rvBrowseList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+ @Override
+ public void onResume() {
+ super.onResume();
+ loadData();
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/FruitDetailActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/FruitDetailActivity.java
new file mode 100644
index 0000000..47f853d
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/FruitDetailActivity.java
@@ -0,0 +1,113 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.example.Flower.R;
+import com.example.Flower.bean.Browse;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.bean.Orders;
+import com.example.Flower.util.SPUtils;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+/**
+ * 菜品明细信息
+ */
+public class FruitDetailActivity extends AppCompatActivity {
+ private Activity mActivity;
+ private ImageView ivImg;
+ private TextView tvTitle;
+ private TextView tvDate;
+ private TextView tvContent;
+ private TextView tvIssuer;
+ private Button btnCollect;
+ private Button btnCancel;
+ private ActionBar mActionBar;//标题栏
+ private SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mActivity = this;
+ setContentView(R.layout.activity_fruit_detail);
+ ivImg = findViewById(R.id.img);
+ tvTitle= findViewById(R.id.title);
+ tvDate = findViewById(R.id.date);
+ tvContent = findViewById(R.id.content);
+ tvIssuer = findViewById(R.id.issuer);
+ btnCollect = findViewById(R.id.btn_collect);
+ btnCancel = findViewById(R.id.btn_cancel);
+ mActionBar = findViewById(R.id.myActionBar);
+ //侧滑菜单
+ mActionBar.setData(mActivity,"信息详情", R.drawable.ic_back, 0, 0, getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ Fruit fruit = (Fruit) getIntent().getSerializableExtra("fruit");
+ tvTitle.setText(fruit.getTitle());
+ tvDate.setText(fruit.getDate());
+ tvContent.setText(fruit.getContent());
+ tvIssuer.setText(String.format("¥ %s",fruit.getIssuer()));
+ Glide.with(mActivity)
+ .asBitmap()
+ .skipMemoryCache(true)
+ .load(fruit.getImg())
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .into(ivImg);
+ String account = (String) SPUtils.get(mActivity,SPUtils.ACCOUNT,"");
+ Browse browse = DataSupport.where("account = ? and title = ?",account,fruit.getTitle()).findFirst(Browse.class);//浏览记录
+ if (browse == null) {//不存在该条浏览记录 新增记录
+ Browse browse1 = new Browse(account,fruit.getTitle());
+ browse1.save();
+ }
+ Boolean isAdmin = (Boolean) SPUtils.get(mActivity,SPUtils.IS_ADMIN,false);
+ if (!isAdmin){
+ Orders order = DataSupport.where("account = ? and title = ?",account,fruit.getTitle()).findFirst(Orders.class);
+ btnCollect.setVisibility(order!=null? View.GONE: View.VISIBLE);
+ btnCancel.setVisibility(order!=null? View.VISIBLE: View.GONE);
+ }
+ //收藏
+ btnCollect.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Orders order = new Orders(account,fruit.getTitle(),"S"+ System.currentTimeMillis(),account,sf.format(new Date()));
+ order.save();
+ Toast.makeText(mActivity,"购买成功", Toast.LENGTH_SHORT).show();
+ btnCollect.setVisibility(View.GONE);
+ btnCancel.setVisibility(View.VISIBLE);
+ }
+ });
+ //取消收藏
+ btnCancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Orders order = DataSupport.where("account = ? and title = ?",account,fruit.getTitle()).findFirst(Orders.class);
+ order.delete();
+ Toast.makeText(mActivity,"取消成功", Toast.LENGTH_SHORT).show();
+ btnCollect.setVisibility(View.VISIBLE);
+ btnCancel.setVisibility(View.GONE);
+ }
+ });
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/LoginActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/LoginActivity.java
new file mode 100644
index 0000000..4eae5c9
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/LoginActivity.java
@@ -0,0 +1,126 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.User;
+import com.example.Flower.util.SPUtils;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+
+/**
+ * 登录页面
+ */
+public class LoginActivity extends Activity {
+ private static final String TAG = "LoginActivity";
+ private Activity activity;
+ private ActionBar mTitleBar;//标题栏
+ private EditText etAccount;//手机号
+ private EditText etPassword;//密码
+ private TextView tvRegister;//注册
+ private Button btnLogin;//登录按钮
+ private RadioGroup rgType;//用户类型
+ private RadioButton rbUser;//用户类型
+ private RadioButton rbAdmin;//用户类型
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ activity=this;
+ setContentView(R.layout.activity_login);//加载页面
+ etAccount =(EditText) findViewById(R.id.et_account);//获取手机号
+ etPassword=(EditText)findViewById(R.id.et_password);//获取密码
+ tvRegister=(TextView)findViewById(R.id.tv_register);//获取注册
+ btnLogin=(Button)findViewById(R.id.btn_login);//获取登录
+ rgType = findViewById(R.id.rg_type);
+ rbUser = findViewById(R.id.rb_user);
+ rbAdmin = findViewById(R.id.rb_admin);
+ mTitleBar = (ActionBar)findViewById(R.id.myActionBar);
+ mTitleBar.setData(activity,"登录",0, 0, 0,getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+
+ //手机号注册
+ tvRegister.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //跳转到注册页面
+ Intent intent=new Intent(activity, RegisterActivity.class);
+ startActivity(intent);
+ }
+ });
+ //选择类型
+ rgType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(RadioGroup group, int checkedId) {
+ SPUtils.put(activity,SPUtils.IS_ADMIN,checkedId == R.id.rb_admin);
+ }
+ });
+ //设置点击按钮
+ btnLogin.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //关闭虚拟键盘
+ InputMethodManager inputMethodManager= (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),0);
+ //获取请求参数
+ String account= etAccount.getText().toString();
+ String password=etPassword.getText().toString();
+ Boolean isAdmit = (Boolean) SPUtils.get(activity,SPUtils.IS_ADMIN,false);
+ if ("".equals(account)){//账号不能为空
+ Toast.makeText(activity,"账号不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(password)){//密码为空
+ Toast.makeText(activity,"密码为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ User user = DataSupport.where("account = ?", account).findFirst(User.class);
+ if (user != null) {
+ if (!password.equals(user.getPassword())) {
+ Toast.makeText(activity, "密码错误", Toast.LENGTH_SHORT).show();
+ }else{
+ if (isAdmit && !"admin".equals(user.getAccount())){
+ Toast.makeText(activity,"该账号不是管理员账号", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if (!isAdmit && "admin".equals(user.getAccount())){
+ Toast.makeText(activity,"该账号不是普通用户账号", Toast.LENGTH_LONG).show();
+ return;
+ }
+ SPUtils.put(LoginActivity.this,"account",account);
+ Intent intent = new Intent(activity, MainActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ }else{
+ Toast.makeText(activity, "账号不存在", Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/MainActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/MainActivity.java
new file mode 100644
index 0000000..3e0fab4
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/MainActivity.java
@@ -0,0 +1,220 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.RadioButton;
+import android.widget.Toast;
+
+import com.example.Flower.MyApplication;
+import com.example.Flower.R;
+import com.example.Flower.ui.fragment.FruitFragment;
+import com.example.Flower.ui.fragment.OrderFragment;
+import com.example.Flower.ui.fragment.UserFragment;
+import com.example.Flower.ui.fragment.UserManageFragment;
+import com.example.Flower.util.SPUtils;
+import com.example.Flower.widget.ActionBar;
+
+
+/**
+ * 主页面
+ */
+public class MainActivity extends Activity {
+ private ActionBar mActionBar;//标题栏
+ private Activity myActivity;
+ private LinearLayout llContent;
+ private RadioButton rbFruit;
+ private RadioButton rbFruitData;
+ private RadioButton rbUserManage;
+ private RadioButton rbUser;
+ private Fragment[] fragments = new Fragment[]{null, null,null,null};//存放Fragment
+ private Boolean mIsAdmin;//是否管理员
+ private String mAccount;//账号
+
+ @Override
+ protected void onCreate( Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ myActivity = this;
+ setContentView(R.layout.activity_main);
+ MyApplication.Instance.setMainActivity(myActivity);
+ mIsAdmin = (Boolean) SPUtils.get(myActivity, SPUtils.IS_ADMIN,false);
+ llContent = (LinearLayout) findViewById(R.id.ll_main_content);
+ rbFruit = (RadioButton) findViewById(R.id.rb_main_fruit);
+ rbFruitData = (RadioButton) findViewById(R.id.rb_main_fruit_data);
+ rbUserManage = (RadioButton) findViewById(R.id.rb_main_setting);
+ rbUser = (RadioButton) findViewById(R.id.rb_main_user);
+ mActionBar = (ActionBar) findViewById(R.id.myActionBar);
+ //侧滑菜单
+ mActionBar.setData(myActivity,"伊人花卉", 0, 0, 0, getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ initView();
+ setViewListener();
+ }
+
+ private void setViewListener() {
+ rbFruit.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mActionBar.setTitle("伊人花卉");
+ switchFragment(0);
+ }
+ });
+ rbFruitData.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if ("".equals(mAccount)) {////未登录,跳转到登录页面
+ MyApplication.Instance.getMainActivity().finish();
+ startActivity(new Intent(myActivity, LoginActivity.class));
+ }else {//已经登录
+ mActionBar.setTitle("订单");
+ switchFragment(1);
+ }
+ }
+ });
+ rbUserManage.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mActionBar.setTitle("用户管理");
+ switchFragment(2);
+ }
+ });
+ rbUser.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if ("".equals(mAccount)) {////未登录,跳转到登录页面
+ MyApplication.Instance.getMainActivity().finish();
+ startActivity(new Intent(myActivity, LoginActivity.class));
+ }else {//已经登录
+ mActionBar.setTitle("我的");
+ switchFragment(mIsAdmin?3:2);
+ }
+ }
+ });
+ }
+
+ private void initView() {
+ mIsAdmin = (Boolean) SPUtils.get(myActivity,SPUtils.IS_ADMIN,false);
+ mAccount = (String) SPUtils.get(myActivity,SPUtils.ACCOUNT,"");
+ //设置导航栏图标样式
+ Drawable iconNews=getResources().getDrawable(R.drawable.selector_main_rb_home);//设置主页图标样式
+ iconNews.setBounds(0,0,68,68);//设置图标边距 大小
+ rbFruit.setCompoundDrawables(null,iconNews,null,null);//设置图标位置
+ rbFruit.setCompoundDrawablePadding(5);//设置文字与图片的间距
+ Drawable iconNewsData=getResources().getDrawable(R.drawable.selector_main_rb_buy);//设置主页图标样式
+ iconNewsData.setBounds(0,0,68,68);//设置图标边距 大小
+ rbFruitData.setCompoundDrawables(null,iconNewsData,null,null);//设置图标位置
+ rbFruitData.setCompoundDrawablePadding(5);//设置文字与图片的间距
+ Drawable iconSetting=getResources().getDrawable(R.drawable.selector_main_rb_manage);//设置主页图标样式
+ iconSetting.setBounds(0,0,60,60);//设置图标边距 大小
+ rbUserManage.setCompoundDrawables(null,iconSetting,null,null);//设置图标位置
+ rbUserManage.setCompoundDrawablePadding(5);//设置文字与图片的间距
+ Drawable iconUser=getResources().getDrawable(R.drawable.selector_main_rb_user);//设置主页图标样式
+ iconUser.setBounds(0,0,55,55);//设置图标边距 大小
+ rbUser.setCompoundDrawables(null,iconUser,null,null);//设置图标位置
+ rbUser.setCompoundDrawablePadding(5);//设置文字与图片的间距
+ rbUserManage.setVisibility(mIsAdmin? View.VISIBLE: View.GONE);
+ switchFragment(0);
+ rbFruit.setChecked(true);
+ }
+ /**
+ * 方法 - 切换Fragment
+ *
+ * @param fragmentIndex 要显示Fragment的索引
+ */
+ private void switchFragment(int fragmentIndex) {
+ //在Activity中显示Fragment
+ //1、获取Fragment管理器 FragmentManager
+ FragmentManager fragmentManager = this.getFragmentManager();
+ //2、开启fragment事务
+ FragmentTransaction transaction = fragmentManager.beginTransaction();
+
+ //懒加载 - 如果需要显示的Fragment为null,就new。并添加到Fragment事务中
+ if (fragments[fragmentIndex] == null) {
+ if (mIsAdmin){
+ switch (fragmentIndex) {
+ case 0://NewsFragment
+ fragments[fragmentIndex] = new FruitFragment();
+ break;
+ case 1://CollectFragment
+ fragments[fragmentIndex] = new OrderFragment();
+ break;
+ case 2://UserManageFragment
+ fragments[fragmentIndex] = new UserManageFragment();
+ break;
+ case 3://UserFragment
+ fragments[fragmentIndex] = new UserFragment();
+ break;
+ }
+ }else {
+ switch (fragmentIndex) {
+ case 0://NewsFragment
+ fragments[fragmentIndex] = new FruitFragment();
+ break;
+ case 1://CollectFragment
+ fragments[fragmentIndex] = new OrderFragment();
+ break;
+ case 2://UserFragment
+ fragments[fragmentIndex] = new UserFragment();
+ break;
+ }
+ }
+
+ //==添加Fragment对象到Fragment事务中
+ //参数:显示Fragment的容器的ID,Fragment对象
+ transaction.add(R.id.ll_main_content, fragments[fragmentIndex]);
+ }
+
+ //隐藏其他的Fragment
+ for (int i = 0; i < fragments.length; i++) {
+ if (fragmentIndex != i && fragments[i] != null) {
+ //隐藏指定的Fragment
+ transaction.hide(fragments[i]);
+ }
+ }
+ //4、显示Fragment
+ transaction.show(fragments[fragmentIndex]);
+
+ //5、提交事务
+ transaction.commit();
+ }
+ /**
+ * 双击退出
+ *
+ * @param keyCode
+ * @param event
+ * @return
+ */
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ exit();
+ }
+
+ return false;
+ }
+
+ private long time = 0;
+
+ public void exit() {
+ if (System.currentTimeMillis() - time > 2000) {
+ time = System.currentTimeMillis();
+ Toast.makeText(myActivity,"再点击一次退出应用程序", Toast.LENGTH_LONG).show();
+ } else {
+ finish();
+ }
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/OpeningActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/OpeningActivity.java
new file mode 100644
index 0000000..653cfbb
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/OpeningActivity.java
@@ -0,0 +1,111 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.bean.User;
+import com.example.Flower.util.SPUtils;
+import com.example.Flower.util.StatusBarUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+/**
+ * 开屏页面
+ */
+public class OpeningActivity extends AppCompatActivity {
+ private Activity myActivity;
+ private SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ myActivity = this;
+ //设置页面布局
+ setContentView(R.layout.activity_opening);
+ try {
+ initView();
+ } catch (IOException | JSONException e) {
+ e.printStackTrace();
+ }
+
+ }
+ private void initView() throws IOException, JSONException {
+ StatusBarUtil.setStatusBar(myActivity,true);//设置当前界面是否是全屏模式(状态栏)
+ StatusBarUtil.setStatusBarLightMode(myActivity,true);//状态栏文字颜色
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
+ finish();
+ return;
+ }
+ Boolean isFirst= (Boolean) SPUtils.get(myActivity,SPUtils.IF_FIRST,true);
+ String account= (String) SPUtils.get(myActivity,SPUtils.ACCOUNT,"");
+ if (isFirst){//第一次进来 初始化本地数据
+ SPUtils.put(myActivity,SPUtils.IF_FIRST,false);//第一次
+ //初始化数据
+ //获取json数据
+ String rewardJson = "";
+ String rewardJsonLine;
+ //assets文件夹下db.json文件的路径->打开db.json文件
+ BufferedReader bufferedReader = null;
+ try {
+ bufferedReader = new BufferedReader(new InputStreamReader(myActivity.getAssets().open("db.json")));
+ while (true) {
+ if (!((rewardJsonLine = bufferedReader.readLine()) != null)) break;
+ rewardJson += rewardJsonLine;
+ }
+ JSONObject jsonObject = new JSONObject(rewardJson);
+ JSONArray fruitList = jsonObject.getJSONArray("fruit");//获得列表
+ //把物品列表保存到本地
+ for (int i = 0, length = fruitList.length(); i < length; i++) {
+ JSONObject o = fruitList.getJSONObject(i);
+ Fruit fruit = new Fruit(o.getInt("typeId"),
+ o.getString("title"),
+ o.getString("img"),
+ o.getString("content"),
+ o.getString("issuer"),
+ sf.format(new Date())
+ );
+ fruit.save();//保存到本地
+ }
+ User user = new User("admin","123","管理员",22,"123456789@qq.com");
+ user.save();
+ } catch (IOException | JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ //两秒后跳转到主页面
+ Intent intent2 = new Intent();
+ if ("".equals(account)) {
+ intent2.setClass(OpeningActivity.this, MainActivity.class);
+ }else {
+ intent2.setClass(OpeningActivity.this, MainActivity.class);
+ }
+ startActivity(intent2);
+ finish();
+ }
+ }, 2000);
+ }
+
+
+ @Override
+ public void onBackPressed() {
+
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/PasswordActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/PasswordActivity.java
new file mode 100644
index 0000000..024b1fa
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/PasswordActivity.java
@@ -0,0 +1,80 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.User;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+
+/**
+ * 重置密码
+ */
+public class PasswordActivity extends AppCompatActivity {
+ private Activity activity;
+ private ActionBar mTitleBar;//标题栏
+ private EditText etAccount;
+ private EditText etEmail; private EditText etNewPassword;
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ activity =this;
+ setContentView(R.layout.activity_password);
+ etAccount = findViewById(R.id.et_account);
+ etEmail = findViewById(R.id.et_email);
+ etNewPassword = findViewById(R.id.et_new_password);
+ mTitleBar = (ActionBar)findViewById(R.id.myActionBar);
+ mTitleBar.setData(activity,"重置密码", R.drawable.ic_back, 0, 0,getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ }
+
+ //保存信息
+ public void save(View v){
+ //关闭虚拟键盘
+ InputMethodManager inputMethodManager= (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),0);
+ String account = etAccount.getText().toString();
+ String email = etEmail.getText().toString();
+ String newPassword = etNewPassword.getText().toString();
+ if ("".equals(account)){//账号不能为空
+ Toast.makeText(activity,"账号不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(email)){//邮箱为空
+ Toast.makeText(activity,"邮箱为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(newPassword)){//密码为空
+ Toast.makeText(activity,"新密码为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ User user = DataSupport.where("account = ? and email = ?", account,email).findFirst(User.class);
+ if (user != null) {
+ user.setPassword(newPassword);
+ user.save();
+ Toast.makeText(activity, "密码修改成功", Toast.LENGTH_SHORT).show();
+ finish();
+ }else{
+ Toast.makeText(activity, "账号或者邮箱错误", Toast.LENGTH_SHORT).show();
+ }
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/PersonActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/PersonActivity.java
new file mode 100644
index 0000000..547bc13
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/PersonActivity.java
@@ -0,0 +1,103 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.User;
+import com.example.Flower.util.SPUtils;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+
+/**
+ * 个人信息
+ */
+public class PersonActivity extends AppCompatActivity {
+ private Activity mActivity;
+ private ActionBar mTitleBar;//标题栏
+ private TextView tvAccount;
+ private TextView etNickName;
+ private TextView etAge;
+ private TextView etEmail;
+ private Button btnSave;//保存
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_person);
+ mActivity = this;
+ tvAccount = findViewById(R.id.tv_account);
+ etNickName = findViewById(R.id.tv_nickName);
+ etAge = findViewById(R.id.tv_age);
+ etEmail = findViewById(R.id.tv_email);
+ btnSave = findViewById(R.id.btn_save);
+ mTitleBar = (ActionBar) findViewById(R.id.myActionBar);
+ mTitleBar.setData(mActivity,"个人信息", R.drawable.ic_back, 0, 0, getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ initView();
+ }
+
+ private void initView() {
+ String account = (String) SPUtils.get(mActivity,"account","");
+ User user = DataSupport.where("account = ?", account).findFirst(User.class);
+ if (user != null) {
+ tvAccount.setText(user.getAccount());
+ etNickName.setText(user.getNickName());
+ etAge.setText(String.valueOf(user.getAge()));
+ etEmail.setText(user.getEmail());
+ }
+ //保存
+ btnSave.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String account = tvAccount.getText().toString();
+ String nickName = etNickName.getText().toString();
+ String age = etAge.getText().toString();
+ String email = etEmail.getText().toString();
+ User user1 = DataSupport.where("account = ?",account).findFirst(User.class);
+ if ("".equals(nickName)) {
+ Toast.makeText(mActivity,"昵称不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ("".equals(age)) {
+ Toast.makeText(mActivity,"年龄不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ("".equals(email)) {
+ Toast.makeText(mActivity,"邮箱不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ user1.setNickName(nickName);
+ user1.setAge(Integer.valueOf(age));
+ user1.setEmail(email);
+ user1.save();
+ Toast.makeText(mActivity,"保存成功", Toast.LENGTH_SHORT).show();
+ finish();//关闭页面
+ }
+ });
+ /* btnLogout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ MyApplication.Instance.getMainActivity().finish();
+ SPUtils.remove(mActivity,"account");
+ startActivity(new Intent(mActivity, LoginActivity.class));
+ }
+ });*/
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/RegisterActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/RegisterActivity.java
new file mode 100644
index 0000000..3686771
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/RegisterActivity.java
@@ -0,0 +1,125 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.User;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+import java.text.SimpleDateFormat;
+
+
+/**
+ * 注册页面
+ */
+public class RegisterActivity extends Activity {
+ private Activity activity;
+ private ActionBar mTitleBar;//标题栏
+ private EditText etAccount;//手机号
+ private EditText etNickName;//昵称
+ private EditText etAge;//年龄
+ private EditText etEmail;//邮箱
+ private EditText etPassword;//密码
+ private EditText etPasswordSure;//确认密码
+ private TextView tvLogin;//登录
+ private Button btnRegister;//注册按钮
+ private SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ activity=this;
+ setContentView(R.layout.activity_register);//加载页面
+ etAccount =(EditText) findViewById(R.id.et_account);//获取手机号
+ etNickName =(EditText) findViewById(R.id.et_nickName);//获取昵称
+ etAge =(EditText) findViewById(R.id.et_age);//获取年龄
+ etEmail =(EditText) findViewById(R.id.et_email);//获取邮箱
+ etPassword=(EditText) findViewById(R.id.et_password);//获取密码
+ etPasswordSure=(EditText) findViewById(R.id.et_password_sure);//获取确认密码
+ tvLogin=(TextView) findViewById(R.id.tv_login);//登录
+ btnRegister=(Button) findViewById(R.id.btn_register);//获取注册按钮
+ mTitleBar = (ActionBar) findViewById(R.id.myActionBar);
+ mTitleBar.setData(activity,"注册", R.drawable.ic_back, 0, 0, getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ tvLogin.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //跳转到登录页面
+ Intent intent=new Intent(activity, LoginActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ });
+ //设置注册点击按钮
+ btnRegister.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //关闭虚拟键盘
+ InputMethodManager inputMethodManager= (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),0);
+ String account= etAccount.getText().toString();
+ String nickName= etNickName.getText().toString();
+ String age = etAge.getText().toString();
+ String email= etEmail.getText().toString();
+ String password=etPassword.getText().toString();
+ String passwordSure=etPasswordSure.getText().toString();
+ if ("".equals(account)){//账号不能为空
+ Toast.makeText(activity,"账号不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(nickName)){//昵称不能为空
+ Toast.makeText(activity,"昵称不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(age)){//年龄不能为空
+ Toast.makeText(activity,"年龄不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(email)){//邮箱不能为空
+ Toast.makeText(activity,"邮箱不能为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if ("".equals(password)){//密码为空
+ Toast.makeText(activity,"密码为空", Toast.LENGTH_LONG).show();
+ return;
+ }
+ if (!password.equals(passwordSure)){//密码不一致
+ Toast.makeText(activity,"密码不一致", Toast.LENGTH_LONG).show();
+ return;
+ }
+ User user = DataSupport.where("account = ?", account).findFirst(User.class);
+ if (user == null) {
+ user = new User (account,password,nickName, Integer.valueOf(age),email);
+ user.save();//保存用户信息
+ Intent intent = new Intent(activity, LoginActivity.class);
+ startActivity(intent);
+ Toast.makeText(activity, "注册成功", Toast.LENGTH_SHORT).show();
+ finish();
+ }else {
+ Toast.makeText(activity, "该账号已存在", Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/activity/UserDetailActivity.java b/FLower/app/src/main/java/com/example/Flower/ui/activity/UserDetailActivity.java
new file mode 100644
index 0000000..69ab440
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/activity/UserDetailActivity.java
@@ -0,0 +1,92 @@
+package com.example.Flower.ui.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.Flower.R;
+import com.example.Flower.bean.User;
+import com.example.Flower.widget.ActionBar;
+
+import org.litepal.crud.DataSupport;
+
+
+/**
+ * 用户明细
+ */
+public class UserDetailActivity extends AppCompatActivity {
+ private ActionBar mActionBar;//标题栏
+ private Activity mActivity;
+ private TextView account;
+ private EditText nickName;
+ private EditText age;
+ private EditText email;
+ private User mUser;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_user_detail);
+ mActivity = this;
+ account = findViewById(R.id.account);
+ nickName = findViewById(R.id.nickName);
+ age = findViewById(R.id.age);
+ email = findViewById(R.id.email);
+ mActionBar = findViewById(R.id.myActionBar);
+ //侧滑菜单
+ mActionBar.setData(mActivity,"用户信息", R.drawable.ic_back, 0, 0, getResources().getColor(R.color.colorPrimary), new ActionBar.ActionBarClickListener() {
+ @Override
+ public void onLeftClick() {
+ finish();
+ }
+
+ @Override
+ public void onRightClick() {
+ }
+ });
+ mUser = (User) getIntent().getSerializableExtra("user");
+ if (mUser != null) {
+ account.setText(mUser.getAccount());
+ nickName.setText(mUser.getNickName());
+ age.setText(String.valueOf(mUser.getAge()));
+ email.setText(mUser.getEmail());
+ }
+ }
+
+ //保存
+ public void save(View view){
+ User user = DataSupport.where("account = ?",mUser.getAccount()).findFirst(User.class);
+ String nickNameStr = nickName.getText().toString();
+ String ageStr = age.getText().toString();
+ String emailStr = email.getText().toString();
+ if ("".equals(nickNameStr)) {
+ Toast.makeText(mActivity,"昵称不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ("".equals(ageStr)) {
+ Toast.makeText(mActivity,"年龄不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if ("".equals(emailStr)) {
+ Toast.makeText(mActivity,"邮箱不能为空", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if (user != null) {
+ user.setNickName(nickNameStr);
+ user.setAge(Integer.valueOf(ageStr));
+ user.setEmail(emailStr);
+ user.save();
+ Toast.makeText(mActivity,"保存成功", Toast.LENGTH_SHORT).show();
+ finish();
+ }else {
+ Toast.makeText(mActivity,"保存失败", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/fragment/FruitFragment.java b/FLower/app/src/main/java/com/example/Flower/ui/fragment/FruitFragment.java
new file mode 100644
index 0000000..a6817be
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/fragment/FruitFragment.java
@@ -0,0 +1,195 @@
+package com.example.Flower.ui.fragment;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.Flower.MyApplication;
+import com.example.Flower.R;
+import com.example.Flower.adapter.FruitAdapter;
+import com.example.Flower.bean.Fruit;
+import com.example.Flower.ui.activity.AddFruitActivity;
+import com.example.Flower.ui.activity.FruitDetailActivity;
+import com.example.Flower.ui.activity.LoginActivity;
+import com.example.Flower.util.SPUtils;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import com.google.android.material.tabs.TabLayout;
+
+import org.litepal.crud.DataSupport;
+
+import java.util.List;
+
+import static android.app.Activity.RESULT_OK;
+
+
+/**
+ * 水果
+ */
+
+public class FruitFragment extends Fragment {
+ private Activity myActivity;//上下文
+ private TabLayout tabTitle;
+ private RecyclerView rvfruitList;
+ private FruitAdapter mfruitAdapter;
+ private LinearLayout llEmpty;
+ private Boolean mIsAdmin;
+ private EditText etQuery;//搜索内容
+ private ImageView ivSearch;//搜索图标
+ private FloatingActionButton btnAdd;
+ private String[] state = {"0","1","2","3","4","5","6"};
+ private String[] title = {"玫瑰", "月季","满天星" ,"郁金香","牡丹花","风信子","水仙"};
+ private String typeId = "0";
+ private List mfruit;
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ myActivity= (Activity) context;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view=inflater.inflate(R.layout.fragment_fruit,container,false);
+ tabTitle = (TabLayout)view.findViewById(R.id.tab_title);
+ rvfruitList = (RecyclerView)view.findViewById(R.id.rv_fruit_list);
+ llEmpty = view.findViewById(R.id.ll_empty);
+ etQuery=view.findViewById(R.id.et_query);
+ ivSearch=view.findViewById(R.id.iv_search);
+ btnAdd = (FloatingActionButton)view.findViewById(R.id.btn_add);
+ //获取控件
+ initView();
+ //软键盘搜索
+ ivSearch.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ loadData();//加载数据
+ }
+ });
+ //点击软键盘中的搜索
+ etQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ loadData();//加载数据
+ return true;
+ }
+ return false;
+ }
+ });
+ btnAdd.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(myActivity, AddFruitActivity.class);
+ startActivityForResult(intent,100);
+ }
+ });
+ return view;
+ }
+
+ /**
+ * 初始化页面
+ */
+ private void initView() {
+ mIsAdmin = (Boolean) SPUtils.get(myActivity, SPUtils.IS_ADMIN, false);
+ btnAdd.setVisibility(mIsAdmin? View.VISIBLE: View.GONE);
+ tabTitle.setTabMode(TabLayout.MODE_SCROLLABLE);
+ //设置tablayout距离上下左右的距离
+ //tab_title.setPadding(20,20,20,20);
+
+ //为TabLayout添加tab名称
+ for (int i=0;i0){
+ rvfruitList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ mfruitAdapter.addItem(mfruit);
+ }else {
+ rvfruitList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+ @Override
+ public void onResume() {
+ super.onResume();
+ loadData();
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == 100 && resultCode == RESULT_OK){
+ loadData();//加载数据
+ }
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/fragment/OrderFragment.java b/FLower/app/src/main/java/com/example/Flower/ui/fragment/OrderFragment.java
new file mode 100644
index 0000000..71c73c1
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/fragment/OrderFragment.java
@@ -0,0 +1,131 @@
+package com.example.Flower.ui.fragment;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.Flower.R;
+import com.example.Flower.adapter.OrderAdapter;
+import com.example.Flower.bean.Orders;
+import com.example.Flower.util.SPUtils;
+
+import org.litepal.crud.DataSupport;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 订单
+ */
+public class OrderFragment extends Fragment {
+ private Activity myActivity;
+ private LinearLayout llEmpty;
+ private RecyclerView rvOrderList;
+ public OrderAdapter mOrderAdapter;
+ private Boolean mIsAdmin;
+ private EditText etQuery;//搜索内容
+ private ImageView ivSearch;//搜索图标
+ private List mOrder = new ArrayList<>();
+ private String account;
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ myActivity = (Activity) context;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view=inflater.inflate(R.layout.fragment_order,container,false);
+ rvOrderList = view.findViewById(R.id.rv_order_list);
+ llEmpty = view.findViewById(R.id.ll_empty);
+ etQuery=view.findViewById(R.id.et_query);
+ ivSearch=view.findViewById(R.id.iv_search);
+ //获取控件
+ initView();
+ //软键盘搜索
+ ivSearch.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ loadData();//加载数据
+ }
+ });
+ //点击软键盘中的搜索
+ etQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ loadData();//加载数据
+ return true;
+ }
+ return false;
+ }
+ });
+ return view;
+ }
+
+ private void initView() {
+ mIsAdmin = (Boolean) SPUtils.get(myActivity, SPUtils.IS_ADMIN, false);
+ account = (String) SPUtils.get(myActivity, SPUtils.ACCOUNT, "");
+ LinearLayoutManager layoutManager=new LinearLayoutManager(myActivity);
+ //=1.2、设置为垂直排列,用setOrientation方法设置(默认为垂直布局)
+ layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ //=1.3、设置recyclerView的布局管理器
+ rvOrderList.setLayoutManager(layoutManager);
+ //==2、实例化适配器
+ //=2.1、初始化适配器
+ mOrderAdapter =new OrderAdapter(llEmpty, rvOrderList);
+ //=2.3、设置recyclerView的适配器
+ rvOrderList.setAdapter(mOrderAdapter);
+ loadData();//加载数据
+ }
+
+ /**
+ * 加载数据
+ */
+ private void loadData(){
+ String content=etQuery.getText().toString();//获取搜索内容
+ if ("".equals(content) && !mIsAdmin){
+ mOrder = DataSupport.where("account = ? " ,account).find(Orders.class);//查询全部
+ }else {
+ mOrder =DataSupport.where("number like ? and account != ?" ,"%"+content+"%","admin").find(Orders.class);//通过标题模糊查询留言
+ }
+ Collections.reverse(mOrder);
+ if (mOrder !=null && mOrder.size()>0){
+ rvOrderList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ mOrderAdapter.addItem(mOrder);
+ }else {
+ rvOrderList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ loadData();
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == 100){
+ loadData();
+ }
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/fragment/UserFragment.java b/FLower/app/src/main/java/com/example/Flower/ui/fragment/UserFragment.java
new file mode 100644
index 0000000..128348c
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/fragment/UserFragment.java
@@ -0,0 +1,90 @@
+package com.example.Flower.ui.fragment;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+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 android.widget.LinearLayout;
+
+import com.example.Flower.MyApplication;
+import com.example.Flower.R;
+import com.example.Flower.ui.activity.BrowseActivity;
+import com.example.Flower.ui.activity.LoginActivity;
+import com.example.Flower.ui.activity.PasswordActivity;
+import com.example.Flower.ui.activity.PersonActivity;
+import com.example.Flower.util.SPUtils;
+
+
+/**
+ * 个人中心
+ */
+public class UserFragment extends Fragment {
+ private Activity mActivity;
+ private LinearLayout llPerson;
+ private LinearLayout llSecurity;
+ private LinearLayout llBrowse;
+ private Button btnLogout;
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mActivity = (Activity) context;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_user,container,false);
+ llPerson = view.findViewById(R.id.person);
+ llSecurity = view.findViewById(R.id.security);
+ llBrowse = view.findViewById(R.id.browse);
+ btnLogout = view.findViewById(R.id.logout);
+ initView();
+ return view;
+ }
+
+ private void initView() {
+ Boolean isAdmin = (Boolean) SPUtils.get(mActivity,SPUtils.IS_ADMIN,false);
+ llBrowse.setVisibility(isAdmin? View.GONE: View.VISIBLE);
+ //个人信息
+ llPerson.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //跳转页面
+ Intent intent = new Intent(mActivity, PersonActivity.class);
+ startActivity(intent);
+ }
+ });
+ //账号安全
+ llSecurity.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //跳转页面
+ Intent intent = new Intent(mActivity, PasswordActivity.class);
+ startActivity(intent);
+ }
+ });
+ //浏览记录
+ llBrowse.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //跳转页面
+ Intent intent = new Intent(mActivity, BrowseActivity.class);
+ startActivity(intent);
+ }
+ });
+ //退出登录
+ btnLogout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ MyApplication.Instance.getMainActivity().finish();
+ SPUtils.remove(mActivity,SPUtils.IS_ADMIN);
+ SPUtils.remove(mActivity,SPUtils.ACCOUNT);
+ startActivity(new Intent(mActivity, LoginActivity.class));
+ }
+ });
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/ui/fragment/UserManageFragment.java b/FLower/app/src/main/java/com/example/Flower/ui/fragment/UserManageFragment.java
new file mode 100644
index 0000000..df76c8d
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/ui/fragment/UserManageFragment.java
@@ -0,0 +1,128 @@
+package com.example.Flower.ui.fragment;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.Flower.R;
+import com.example.Flower.adapter.UserAdapter;
+import com.example.Flower.bean.User;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
+import org.litepal.crud.DataSupport;
+
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * 用户管理
+ */
+public class UserManageFragment extends Fragment {
+ private Activity myActivity;
+ private LinearLayout llEmpty;
+ private RecyclerView rvUserList;
+ public UserAdapter mUserAdapter;
+ private FloatingActionButton btnAdd;
+ private EditText etQuery;//搜索内容
+ private ImageView ivSearch;//搜索图标
+ private List mUsers;
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ myActivity = (Activity) context;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view=inflater.inflate(R.layout.fragment_user_manage,container,false);
+ rvUserList = view.findViewById(R.id.rv_user_list);
+ llEmpty = view.findViewById(R.id.ll_empty);
+ etQuery=view.findViewById(R.id.et_query);
+ ivSearch=view.findViewById(R.id.iv_search);
+ //获取控件
+ initView();
+ //软键盘搜索
+ ivSearch.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ loadData();//加载数据
+ }
+ });
+ //点击软键盘中的搜索
+ etQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ loadData();//加载数据
+ return true;
+ }
+ return false;
+ }
+ });
+ return view;
+ }
+
+ private void initView() {
+ LinearLayoutManager layoutManager=new LinearLayoutManager(myActivity);
+ //=1.2、设置为垂直排列,用setOrientation方法设置(默认为垂直布局)
+ layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ //=1.3、设置recyclerView的布局管理器
+ rvUserList.setLayoutManager(layoutManager);
+ //==2、实例化适配器
+ //=2.1、初始化适配器
+ mUserAdapter=new UserAdapter(llEmpty, rvUserList);
+ //=2.3、设置recyclerView的适配器
+ rvUserList.setAdapter(mUserAdapter);
+ loadData();
+ }
+
+ /**
+ * 加载数据
+ */
+ private void loadData(){
+ String content=etQuery.getText().toString();//获取搜索内容
+ if ("".equals(content)){
+ mUsers= DataSupport.where("account != ?","admin").find(User.class);//查询全部
+ }else {
+ mUsers=DataSupport.where("account like ?","%"+content+"%").find(User.class);//通过账号模糊查询用户
+ }
+ Collections.reverse(mUsers);
+ if (mUsers !=null && mUsers.size()>0){
+ rvUserList.setVisibility(View.VISIBLE);
+ llEmpty.setVisibility(View.GONE);
+ mUserAdapter.addItem(mUsers);
+ }else {
+ rvUserList.setVisibility(View.GONE);
+ llEmpty.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == 100){
+ initView();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ loadData();
+ }
+}
diff --git a/FLower/app/src/main/java/com/example/Flower/util/SPUtils.java b/FLower/app/src/main/java/com/example/Flower/util/SPUtils.java
new file mode 100644
index 0000000..5bacafc
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/util/SPUtils.java
@@ -0,0 +1,176 @@
+package com.example.Flower.util;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 数据持久化工具类
+ */
+public class SPUtils {
+ public static final String IF_FIRST = "is_first";//是否第一次进来
+ public static final String IS_ADMIN = "is_admin";//是否是管理员
+ public static final String ACCOUNT = "account";//账号
+ /**
+ * 保存在手机里面的文件名
+ */
+ private static final String FILE_NAME = "share_data";
+ /**
+ * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
+ *
+ * @param context 上下文
+ * @param key key值
+ * @param object value值
+ */
+ public static void put(Context context, String key, Object object) {
+
+ SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sp.edit();
+
+ if (object instanceof String) {
+ editor.putString(key, (String) object);
+ } else if (object instanceof Integer) {
+ editor.putInt(key, (Integer) object);
+ } else if (object instanceof Boolean) {
+ editor.putBoolean(key, (Boolean) object);
+ } else if (object instanceof Float) {
+ editor.putFloat(key, (Float) object);
+ } else if (object instanceof Long) {
+ editor.putLong(key, (Long) object);
+ } else {
+ editor.putString(key, object.toString());
+ }
+
+ SharedPreferencesCompat.apply(editor);
+ }
+
+ /**
+ * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
+ *
+ * @param context 上下文
+ * @param key key值
+ * @param defaultObject 默认value值
+ * @return value值
+ */
+ public static Object get(Context context, String key, Object defaultObject) {
+ SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+
+ if (defaultObject instanceof String) {
+ return sp.getString(key, (String) defaultObject);
+ } else if (defaultObject instanceof Integer) {
+ return sp.getInt(key, (Integer) defaultObject);
+ } else if (defaultObject instanceof Boolean) {
+ return sp.getBoolean(key, (Boolean) defaultObject);
+ } else if (defaultObject instanceof Float) {
+ return sp.getFloat(key, (Float) defaultObject);
+ } else if (defaultObject instanceof Long) {
+ return sp.getLong(key, (Long) defaultObject);
+ }
+
+ return null;
+ }
+
+ /**
+ * 移除某个key值已经对应的值
+ *
+ * @param context 上下文
+ * @param key key值
+ */
+ public static void remove(Context context, String key) {
+ SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sp.edit();
+ editor.remove(key);
+ SharedPreferencesCompat.apply(editor);
+ }
+
+ /**
+ * 清除所有数据
+ *
+ * @param context 上下文
+ */
+ public static void clear(Context context) {
+ SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sp.edit();
+ editor.clear();
+ SharedPreferencesCompat.apply(editor);
+ }
+
+ /**
+ * 查询某个key是否已经存在
+ *
+ * @param context 上下文
+ * @param key key值
+ * @return 是否存在
+ */
+ public static boolean contains(Context context, String key) {
+ SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+ return sp.contains(key);
+ }
+
+ /**
+ * 返回所有的键值对
+ *
+ * @param context 上下文
+ * @return 所有的键值对
+ */
+ public static Map getAll(Context context) {
+ SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+ return sp.getAll();
+ }
+
+ /**
+ * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
+ *
+ * @author zhy
+ */
+ private static class SharedPreferencesCompat {
+ private static final Method sApplyMethod = findApplyMethod();
+
+ /**
+ * 反射查找apply的方法
+ *
+ * @return Method
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private static Method findApplyMethod() {
+ try {
+ Class clz = SharedPreferences.Editor.class;
+ return clz.getMethod("apply");
+ } catch (NoSuchMethodException e) {
+ }
+
+ return null;
+ }
+
+ /**
+ * 如果找到则使用apply执行,否则使用commit
+ *
+ * @param editor SharedPreferences.Edito
+ */
+ public static void apply(SharedPreferences.Editor editor) {
+ try {
+ if (sApplyMethod != null) {
+ sApplyMethod.invoke(editor);
+ return;
+ }
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ editor.commit();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/FLower/app/src/main/java/com/example/Flower/util/StatusBarUtil.java b/FLower/app/src/main/java/com/example/Flower/util/StatusBarUtil.java
new file mode 100644
index 0000000..a1d98f2
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/util/StatusBarUtil.java
@@ -0,0 +1,212 @@
+package com.example.Flower.util;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Build;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+
+import com.example.Flower.R;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+/**
+ * 全屏显示 状态栏工具类
+ */
+public class StatusBarUtil {
+ /**
+ * 修改当前 Activity 的显示模式,hideStatusBarBackground :true 全屏模式,false 着色模式
+ *
+ * @param activity
+ * @param hideStatusBarBackground
+ */
+ public static void setStatusBar(Activity activity, boolean hideStatusBarBackground) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ Window window = activity.getWindow();
+ window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ if (hideStatusBarBackground) {
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+ } else {
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ }
+
+ ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT);
+ View mChildView = mContentView.getChildAt(0);
+ if (mChildView != null) {
+ if (hideStatusBarBackground) {
+ mChildView.setPadding(
+ mChildView.getPaddingLeft(),
+ 0,
+ mChildView.getPaddingRight(),
+ mChildView.getPaddingBottom()
+ );
+ } else {
+ int statusHeight = getStatusBarHeight(activity);
+ mChildView.setPadding(
+ mChildView.getPaddingLeft(),
+ statusHeight,
+ mChildView.getPaddingRight(),
+ mChildView.getPaddingBottom()
+ );
+ }
+ }
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ Window window = activity.getWindow();
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ if (hideStatusBarBackground) {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ window.setStatusBarColor(Color.TRANSPARENT);
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+ } else {
+ window.setStatusBarColor(activity.getResources().getColor(R.color.colorPrimary));
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ }
+ }
+ }
+ /**
+ * 获取手机状态栏高度
+ */
+ public static int getStatusBarHeight(Context context) {
+ int result = 0;
+ int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+ if (resourceId > 0) {
+ result = context.getResources().getDimensionPixelSize(resourceId);
+ }
+ return result;
+ }
+ /**
+ *设置状态栏颜色
+ */
+ /* public static void setStatusBarColor(Activity activity, int colorId) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ Window window = activity.getWindow();
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.setStatusBarColor(activity.getResources().getColor(colorId));
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明
+ transparentBar(activity);
+ SystemBarTintManager tintManager = new SystemBarTintManager(activity);
+ tintManager.setStatusBarTintEnabled(true);
+ tintManager.setStatusBarTintResource(colorId);
+ }
+ }*/
+ @TargetApi(19)
+ public static void transparentBar(Activity activity) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ Window window = activity.getWindow();
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.setStatusBarColor(Color.TRANSPARENT);
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ Window window = activity.getWindow();
+ window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
+ WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ }
+ }
+ /**
+ * 设置状态栏文字颜色 true 为黑色 false 为白色(XML跟布局配置 android:fitsSystemWindows="true",否则布局会上移)
+ */
+ public static void setStatusBarLightMode(Activity activity, boolean dark) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ if (dark) { //
+ if (MIUISetStatusBarLightMode(activity, dark)) {
+ } else if (FlymeSetStatusBarLightMode(activity.getWindow(), dark)) {
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ //其他
+ activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+ }
+ } else {
+ if (MIUISetStatusBarLightMode(activity, dark)) {
+ } else if (FlymeSetStatusBarLightMode(activity.getWindow(), dark)) {
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ }
+ }
+ }
+ }
+ /**
+ * 设置状态栏图标为深色和魅族特定的文字风格
+ * 可以用来判断是否为Flyme用户
+ *
+ * @param window 需要设置的窗口
+ * @param dark 是否把状态栏文字及图标颜色设置为深色
+ * @return boolean 成功执行返回true
+ */
+ public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {
+ boolean result = false;
+ if (window != null) {
+ try {
+ WindowManager.LayoutParams lp = window.getAttributes();
+ Field darkFlag = WindowManager.LayoutParams.class
+ .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
+ Field meizuFlags = WindowManager.LayoutParams.class
+ .getDeclaredField("meizuFlags");
+ darkFlag.setAccessible(true);
+ meizuFlags.setAccessible(true);
+ int bit = darkFlag.getInt(null);
+ int value = meizuFlags.getInt(lp);
+ if (dark) {
+ value |= bit;
+ } else {
+ value &= ~bit;
+ }
+ meizuFlags.setInt(lp, value);
+ window.setAttributes(lp);
+ result = true;
+ } catch (Exception e) {
+
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 需要MIUIV6以上
+ *
+ * @param activity
+ * @param dark 是否把状态栏文字及图标颜色设置为深色
+ * @return boolean 成功执行返回true
+ */
+ public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
+ boolean result = false;
+ Window window = activity.getWindow();
+ if (window != null) {
+ Class clazz = window.getClass();
+ try {
+ int darkModeFlag = 0;
+ Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
+ Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
+ darkModeFlag = field.getInt(layoutParams);
+ Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
+ if (dark) {
+ extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
+ } else {
+ extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
+ }
+ result = true;
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
+ if (dark) {
+ activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+ } else {
+ activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ }
+ }
+ } catch (Exception e) {
+ }
+ }
+ return result;
+ }
+
+}
\ No newline at end of file
diff --git a/FLower/app/src/main/java/com/example/Flower/widget/ActionBar.java b/FLower/app/src/main/java/com/example/Flower/widget/ActionBar.java
new file mode 100644
index 0000000..e371978
--- /dev/null
+++ b/FLower/app/src/main/java/com/example/Flower/widget/ActionBar.java
@@ -0,0 +1,307 @@
+package com.example.Flower.widget;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.core.graphics.ColorUtils;
+
+import com.example.Flower.R;
+
+
+/**
+ * 自定义ActionBar
+ */
+public final class ActionBar extends LinearLayout {
+
+ private LinearLayout llActionbarRoot;//自定义ActionBar根节点
+ private View vStatusBar;//状态栏位置
+ private ImageView ivLeft;//左边图标
+ private TextView tvLeft;//左边
+ private TextView tvTitle;//中间标题
+ private ImageView ivRight;//右边图标
+ private Button btnRight;//右边按钮
+ private TextView tvRight;//右边文字
+ public ActionBar(Context context) {
+ this(context, null);
+ }
+
+ public ActionBar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+
+ }
+
+ /**
+ * 设置标题
+ * @param title
+ */
+ public void setTitle(String title){
+ if (!TextUtils.isEmpty(title)) {
+ tvTitle.setText(title);
+ } else {
+ tvTitle.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * 设置左侧文本
+ * @param text
+ */
+ public void setLeftText(String text){
+ if (!TextUtils.isEmpty(text)) {
+ tvLeft.setText(text);
+ tvLeft.setVisibility(View.VISIBLE);
+ } else {
+ tvLeft.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * 设置左侧图标
+ * @param ico
+ */
+ public void setLeftIco(int ico){
+ if (ico!=0) {
+ ivLeft.setImageResource(ico);
+ ivLeft.setVisibility(View.VISIBLE);
+ } else {
+ ivLeft.setVisibility(View.GONE);
+ }
+ }
+
+
+ /**
+ * 设置右侧文本
+ * @param text
+ */
+ public void setRightText(String text){
+ if (!TextUtils.isEmpty(text)) {
+ tvRight.setText(text);
+ tvRight.setVisibility(View.VISIBLE);
+ } else {
+ tvRight.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * 设置右侧btn
+ * @param text
+ */
+ public void setRightBtn(String text){
+ if (!TextUtils.isEmpty(text)) {
+ btnRight.setText(text);
+ btnRight.setVisibility(View.VISIBLE);
+ } else {
+ btnRight.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * 设置右侧图标
+ * @param ico
+ */
+ public void setRightIco(int ico){
+ if (ico!=0) {
+ ivRight.setImageResource(ico);
+ ivRight.setVisibility(View.VISIBLE);
+ } else {
+ ivRight.setVisibility(View.GONE);
+ }
+ }
+
+ private void init(Context context) {
+ setOrientation(HORIZONTAL);//设置横向布局
+ View contentView = inflate(getContext(), R.layout.widget_actionbar, this);
+ //获取控件
+ llActionbarRoot = (LinearLayout)contentView.findViewById(R.id.ll_actionbar_root);
+ vStatusBar = contentView.findViewById(R.id.v_statusbar);
+ ivLeft = (ImageView)contentView.findViewById(R.id.iv_actionbar_left);
+ tvLeft=(TextView) contentView.findViewById(R.id.tv_actionbar_left);
+ tvTitle =(TextView) contentView.findViewById(R.id.tv_actionbar_title);
+ ivRight =(ImageView) contentView.findViewById(R.id.iv_actionbar_right);
+ btnRight=(Button) contentView.findViewById(R.id.btn_actionbar_right);
+ tvRight=(TextView) contentView.findViewById(R.id.tv_actionbar_right);
+ }
+
+ /**
+ * 设置透明度
+ *
+ * @param transAlpha{Integer} 0-255 之间
+ */
+ public void setTranslucent(int transAlpha) {
+ //设置透明度
+ llActionbarRoot.setBackgroundColor(ColorUtils.setAlphaComponent(getResources().getColor(R.color.colorPrimary), transAlpha));
+ tvTitle.setAlpha(transAlpha);
+ ivLeft.setAlpha(transAlpha);
+ ivRight.setAlpha(transAlpha);
+ }
+ /**
+ * 设置数据
+ *
+ * @param strTitle 标题
+ * @param resIdLeft 左边图标资源
+ * @param resIdRight 右边图标资源
+ * @param intColor 内容颜色 0为白色 1为黑色
+ * @param backgroundColor 背景颜色
+ * @param listener 点击事件监听
+ */
+ public void setData(String strTitle, int resIdLeft, int resIdRight, int intColor, int backgroundColor, final ActionBarClickListener listener) {
+ String textColor=intColor==0?"#FFFFFF":"#000000";
+ if (!TextUtils.isEmpty(strTitle)) {
+ tvTitle.setText(strTitle);
+ tvTitle.setTextColor(Color.parseColor(textColor));
+ } else {
+ tvTitle.setVisibility(View.GONE);
+ }
+ if (resIdLeft == 0) {
+ ivLeft.setVisibility(View.GONE);
+ } else {
+ ivLeft.setBackgroundResource(resIdLeft);
+ ivLeft.setVisibility(View.VISIBLE);
+ }
+ if (resIdRight == 0) {
+ ivRight.setVisibility(View.GONE);
+ } else {
+ ivRight.setBackgroundResource(resIdRight);
+ ivRight.setVisibility(View.VISIBLE);
+ }
+
+ if (backgroundColor==0){
+ llActionbarRoot.setBackgroundResource(0);
+ }else {
+ llActionbarRoot.setBackgroundColor(backgroundColor);//设置标题栏背景颜色
+ }
+ if (listener != null) {
+ ivLeft.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onLeftClick();
+ }
+ });
+ ivRight.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onRightClick();
+ }
+ });
+ }
+ }
+ public void setData(Activity context, String strTitle, int resIdLeft, int resIdRight, int intColor, int backgroundColor, final ActionBarClickListener listener) {
+ String textColor=intColor==0?"#FFFFFF":"#000000";
+ if (!TextUtils.isEmpty(strTitle)) {
+ tvTitle.setText(strTitle);
+ tvTitle.setTextColor(Color.parseColor(textColor));
+ } else {
+ tvTitle.setVisibility(View.GONE);
+ }
+ if (resIdLeft == 0) {
+ ivLeft.setVisibility(View.GONE);
+ } else {
+ ivLeft.setBackgroundResource(resIdLeft);
+ ivLeft.setVisibility(View.VISIBLE);
+ }
+ if (resIdRight == 0) {
+ ivRight.setVisibility(View.GONE);
+ } else {
+ ivRight.setBackgroundResource(resIdRight);
+ ivRight.setVisibility(View.VISIBLE);
+ }
+
+ if (backgroundColor==0){
+ llActionbarRoot.setBackgroundResource(0);
+ }else {
+ llActionbarRoot.setBackgroundColor(backgroundColor);//设置标题栏背景颜色
+ }
+ if (listener != null) {
+ ivLeft.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onLeftClick();
+ }
+ });
+ ivRight.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onRightClick();
+ }
+ });
+ }
+ }
+
+ public void setData(String strTitle, int resIdLeft, String strRight, int intColor, int backgroundColor, final ActionBarClickListener listener) {
+ String textColor=intColor==0?"#FFFFFF":"#000000";
+ if (!TextUtils.isEmpty(strTitle)) {
+ tvTitle.setText(strTitle);
+ tvTitle.setTextColor(Color.parseColor(textColor));
+ } else {
+ tvTitle.setVisibility(View.GONE);
+ }
+ if (resIdLeft == 0) {
+ ivLeft.setVisibility(View.GONE);
+ } else {
+ ivLeft.setBackgroundResource(resIdLeft);
+ ivLeft.setVisibility(View.VISIBLE);
+ }
+ if (!TextUtils.isEmpty(strRight)) {
+ btnRight.setText(strRight);
+ btnRight.setVisibility(View.VISIBLE);
+ } else {
+ btnRight.setVisibility(View.GONE);
+ }
+ if (backgroundColor==0){
+ llActionbarRoot.setBackgroundResource(0);
+ }else {
+ llActionbarRoot.setBackgroundColor(backgroundColor);//设置标题栏背景颜色
+ }
+ if (listener != null) {
+ if(ivLeft.getVisibility()==VISIBLE){
+ ivLeft.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onLeftClick();
+ }
+ });
+ }else if(tvLeft.getVisibility()==VISIBLE){
+ tvLeft.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onLeftClick();
+ }
+ });
+ }
+
+
+ if(btnRight.getVisibility()==VISIBLE){
+ btnRight.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onRightClick();
+ }
+ });
+ }else if(tvRight.getVisibility()==VISIBLE){
+ tvRight.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ listener.onRightClick();
+ }
+ });
+ }
+
+ }
+ }
+ public interface ActionBarClickListener {
+ //左边点击
+ void onLeftClick();
+ //右边点击
+ void onRightClick();
+ }
+}
diff --git a/FLower/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/FLower/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/FLower/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/bg2.jpg b/FLower/app/src/main/res/drawable/bg2.jpg
new file mode 100644
index 0000000..c1db5a5
Binary files /dev/null and b/FLower/app/src/main/res/drawable/bg2.jpg differ
diff --git a/FLower/app/src/main/res/drawable/bg_border_bottom.xml b/FLower/app/src/main/res/drawable/bg_border_bottom.xml
new file mode 100644
index 0000000..6cc85d7
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/bg_border_bottom.xml
@@ -0,0 +1,12 @@
+
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/bg_border_top.xml b/FLower/app/src/main/res/drawable/bg_border_top.xml
new file mode 100644
index 0000000..6d55a27
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/bg_border_top.xml
@@ -0,0 +1,13 @@
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/bg_ripple.xml b/FLower/app/src/main/res/drawable/bg_ripple.xml
new file mode 100644
index 0000000..8196e32
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/bg_ripple.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/bg_round_white.xml b/FLower/app/src/main/res/drawable/bg_round_white.xml
new file mode 100644
index 0000000..f21b914
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/bg_round_white.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/btn_border_fill.xml b/FLower/app/src/main/res/drawable/btn_border_fill.xml
new file mode 100644
index 0000000..6ddf4be
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/btn_border_fill.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/drawable/btn_border_fill_enabled.xml b/FLower/app/src/main/res/drawable/btn_border_fill_enabled.xml
new file mode 100644
index 0000000..5799fad
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/btn_border_fill_enabled.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/drawable/btn_border_radius_fill_gray.xml b/FLower/app/src/main/res/drawable/btn_border_radius_fill_gray.xml
new file mode 100644
index 0000000..01c37c3
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/btn_border_radius_fill_gray.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/drawable/ic_add.png b/FLower/app/src/main/res/drawable/ic_add.png
new file mode 100644
index 0000000..b364668
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_add.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_back.png b/FLower/app/src/main/res/drawable/ic_back.png
new file mode 100644
index 0000000..14d7a52
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_back.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_browse.png b/FLower/app/src/main/res/drawable/ic_browse.png
new file mode 100644
index 0000000..57d9df6
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_browse.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_buy.png b/FLower/app/src/main/res/drawable/ic_buy.png
new file mode 100644
index 0000000..f7ed474
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_buy.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_buy_check.png b/FLower/app/src/main/res/drawable/ic_buy_check.png
new file mode 100644
index 0000000..83ed900
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_buy_check.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_empty.png b/FLower/app/src/main/res/drawable/ic_empty.png
new file mode 100644
index 0000000..a78bcb0
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_empty.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_error.png b/FLower/app/src/main/res/drawable/ic_error.png
new file mode 100644
index 0000000..2b30898
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_error.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_favorite.png b/FLower/app/src/main/res/drawable/ic_favorite.png
new file mode 100644
index 0000000..48b30ef
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_favorite.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_go.png b/FLower/app/src/main/res/drawable/ic_go.png
new file mode 100644
index 0000000..539d327
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_go.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_home.png b/FLower/app/src/main/res/drawable/ic_home.png
new file mode 100644
index 0000000..72b80fb
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_home.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_home_check.png b/FLower/app/src/main/res/drawable/ic_home_check.png
new file mode 100644
index 0000000..edb59c4
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_home_check.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_launcher_background.xml b/FLower/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/drawable/ic_logo.png b/FLower/app/src/main/res/drawable/ic_logo.png
new file mode 100644
index 0000000..0a3b6d0
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_logo.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_manage.png b/FLower/app/src/main/res/drawable/ic_manage.png
new file mode 100644
index 0000000..9a9b8f1
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_manage.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_manage_check.png b/FLower/app/src/main/res/drawable/ic_manage_check.png
new file mode 100644
index 0000000..18fd6ef
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_manage_check.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_person.png b/FLower/app/src/main/res/drawable/ic_person.png
new file mode 100644
index 0000000..7ca59c4
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_person.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_right.png b/FLower/app/src/main/res/drawable/ic_right.png
new file mode 100644
index 0000000..e6e167b
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_right.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_search_gray.png b/FLower/app/src/main/res/drawable/ic_search_gray.png
new file mode 100644
index 0000000..baefd29
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_search_gray.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_security.png b/FLower/app/src/main/res/drawable/ic_security.png
new file mode 100644
index 0000000..219e92b
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_security.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_user.png b/FLower/app/src/main/res/drawable/ic_user.png
new file mode 100644
index 0000000..ba7689b
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_user.png differ
diff --git a/FLower/app/src/main/res/drawable/ic_user_check.png b/FLower/app/src/main/res/drawable/ic_user_check.png
new file mode 100644
index 0000000..3a7a272
Binary files /dev/null and b/FLower/app/src/main/res/drawable/ic_user_check.png differ
diff --git a/FLower/app/src/main/res/drawable/logo1.jpg b/FLower/app/src/main/res/drawable/logo1.jpg
new file mode 100644
index 0000000..f1cf9a8
Binary files /dev/null and b/FLower/app/src/main/res/drawable/logo1.jpg differ
diff --git a/FLower/app/src/main/res/drawable/selector_main_rb_buy.xml b/FLower/app/src/main/res/drawable/selector_main_rb_buy.xml
new file mode 100644
index 0000000..81c3050
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/selector_main_rb_buy.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/selector_main_rb_home.xml b/FLower/app/src/main/res/drawable/selector_main_rb_home.xml
new file mode 100644
index 0000000..7e3c375
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/selector_main_rb_home.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/selector_main_rb_manage.xml b/FLower/app/src/main/res/drawable/selector_main_rb_manage.xml
new file mode 100644
index 0000000..c4d3c2d
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/selector_main_rb_manage.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/selector_main_rb_text.xml b/FLower/app/src/main/res/drawable/selector_main_rb_text.xml
new file mode 100644
index 0000000..ddfd02c
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/selector_main_rb_text.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/selector_main_rb_user.xml b/FLower/app/src/main/res/drawable/selector_main_rb_user.xml
new file mode 100644
index 0000000..be28f20
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/selector_main_rb_user.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/drawable/sharp.xml b/FLower/app/src/main/res/drawable/sharp.xml
new file mode 100644
index 0000000..9845e04
--- /dev/null
+++ b/FLower/app/src/main/res/drawable/sharp.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_browse.xml b/FLower/app/src/main/res/layout/activity_browse.xml
new file mode 100644
index 0000000..b1b7091
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_browse.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_fruit_add.xml b/FLower/app/src/main/res/layout/activity_fruit_add.xml
new file mode 100644
index 0000000..ef76f4d
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_fruit_add.xml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_fruit_detail.xml b/FLower/app/src/main/res/layout/activity_fruit_detail.xml
new file mode 100644
index 0000000..e2554cb
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_fruit_detail.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_login.xml b/FLower/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..a37d719
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_main.xml b/FLower/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..4f901e0
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_opening.xml b/FLower/app/src/main/res/layout/activity_opening.xml
new file mode 100644
index 0000000..fd6bb65
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_opening.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_password.xml b/FLower/app/src/main/res/layout/activity_password.xml
new file mode 100644
index 0000000..bbd6418
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_password.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_person.xml b/FLower/app/src/main/res/layout/activity_person.xml
new file mode 100644
index 0000000..1e15077
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_person.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/layout/activity_register.xml b/FLower/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..3920d31
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/activity_user_detail.xml b/FLower/app/src/main/res/layout/activity_user_detail.xml
new file mode 100644
index 0000000..03092f4
--- /dev/null
+++ b/FLower/app/src/main/res/layout/activity_user_detail.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/fragment_fruit.xml b/FLower/app/src/main/res/layout/fragment_fruit.xml
new file mode 100644
index 0000000..f14e2ce
--- /dev/null
+++ b/FLower/app/src/main/res/layout/fragment_fruit.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/layout/fragment_order.xml b/FLower/app/src/main/res/layout/fragment_order.xml
new file mode 100644
index 0000000..19763d0
--- /dev/null
+++ b/FLower/app/src/main/res/layout/fragment_order.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/fragment_user.xml b/FLower/app/src/main/res/layout/fragment_user.xml
new file mode 100644
index 0000000..e744c38
--- /dev/null
+++ b/FLower/app/src/main/res/layout/fragment_user.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/layout/fragment_user_manage.xml b/FLower/app/src/main/res/layout/fragment_user_manage.xml
new file mode 100644
index 0000000..9ebb17d
--- /dev/null
+++ b/FLower/app/src/main/res/layout/fragment_user_manage.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/item_rv_collect_list.xml b/FLower/app/src/main/res/layout/item_rv_collect_list.xml
new file mode 100644
index 0000000..7602363
--- /dev/null
+++ b/FLower/app/src/main/res/layout/item_rv_collect_list.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/item_rv_fruit_list.xml b/FLower/app/src/main/res/layout/item_rv_fruit_list.xml
new file mode 100644
index 0000000..42eaf00
--- /dev/null
+++ b/FLower/app/src/main/res/layout/item_rv_fruit_list.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/item_rv_order_list.xml b/FLower/app/src/main/res/layout/item_rv_order_list.xml
new file mode 100644
index 0000000..9bc5faf
--- /dev/null
+++ b/FLower/app/src/main/res/layout/item_rv_order_list.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/item_rv_user_list.xml b/FLower/app/src/main/res/layout/item_rv_user_list.xml
new file mode 100644
index 0000000..261bd54
--- /dev/null
+++ b/FLower/app/src/main/res/layout/item_rv_user_list.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/layout/widget_actionbar.xml b/FLower/app/src/main/res/layout/widget_actionbar.xml
new file mode 100644
index 0000000..cb3a28d
--- /dev/null
+++ b/FLower/app/src/main/res/layout/widget_actionbar.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/FLower/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/FLower/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/FLower/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/FLower/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/mipmap-hdpi/ic_launcher.png b/FLower/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..a571e60
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/FLower/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/FLower/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..61da551
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/FLower/app/src/main/res/mipmap-mdpi/ic_launcher.png b/FLower/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c41dd28
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/FLower/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/FLower/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..db5080a
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/FLower/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/FLower/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..6dba46d
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/FLower/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/FLower/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..da31a87
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/FLower/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/FLower/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..15ac681
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/FLower/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/FLower/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..b216f2d
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/FLower/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/FLower/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..f25a419
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/FLower/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/FLower/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..e96783c
Binary files /dev/null and b/FLower/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/FLower/app/src/main/res/values/array.xml b/FLower/app/src/main/res/values/array.xml
new file mode 100644
index 0000000..b84fe11
--- /dev/null
+++ b/FLower/app/src/main/res/values/array.xml
@@ -0,0 +1,12 @@
+
+
+
+ - 玫瑰花
+ - 月季花
+ - 满天星
+ - 郁金香
+ - 牡丹花
+ - 风信子
+ - 水仙花
+
+
diff --git a/FLower/app/src/main/res/values/colors.xml b/FLower/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..1ee1188
--- /dev/null
+++ b/FLower/app/src/main/res/values/colors.xml
@@ -0,0 +1,18 @@
+
+
+ #FF9800
+ #FF9800
+ #FF9800
+ #FF9800
+ #FF9800
+ #FF9800
+ #000000
+ #ffffff
+ #BCB7B7
+ #cccccc
+ #52CCCCCC
+ #2DCCCCCC
+ #FFC0CB
+ #66FFFF
+ #FF0000
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/values/strings.xml b/FLower/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b007cca
--- /dev/null
+++ b/FLower/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ 伊人花卉
+
\ No newline at end of file
diff --git a/FLower/app/src/main/res/values/styles.xml b/FLower/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..6dba9bd
--- /dev/null
+++ b/FLower/app/src/main/res/values/styles.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/FLower/app/src/main/res/xml/network_security_config.xml b/FLower/app/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..cd5e6cd
--- /dev/null
+++ b/FLower/app/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FLower/app/src/test/java/com/example/Flower/ExampleUnitTest.java b/FLower/app/src/test/java/com/example/Flower/ExampleUnitTest.java
new file mode 100644
index 0000000..e09fc55
--- /dev/null
+++ b/FLower/app/src/test/java/com/example/Flower/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.Flower;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/FLower/build.gradle b/FLower/build.gradle
new file mode 100644
index 0000000..4d24be2
--- /dev/null
+++ b/FLower/build.gradle
@@ -0,0 +1,24 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:4.1.1"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/FLower/gradle.properties b/FLower/gradle.properties
new file mode 100644
index 0000000..839d749
--- /dev/null
+++ b/FLower/gradle.properties
@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+android.overridePathCheck=true
diff --git a/FLower/gradle/wrapper/gradle-wrapper.jar b/FLower/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
Binary files /dev/null and b/FLower/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/FLower/gradle/wrapper/gradle-wrapper.properties b/FLower/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..58d8bd1
--- /dev/null
+++ b/FLower/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sun Oct 10 19:36:32 CST 2021
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
diff --git a/FLower/gradlew b/FLower/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/FLower/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/FLower/gradlew.bat b/FLower/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/FLower/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/FLower/settings.gradle b/FLower/settings.gradle
new file mode 100644
index 0000000..d1a426e
--- /dev/null
+++ b/FLower/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = "Flower"
+include ':app'