diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed39c46 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +### liyuxuan_gitProject简介 + +- 软件工程课程设计项目——“航吃hang吃”。本项目旨在研究并设计一基于Android的解决餐食问题的系统,系统能实现具有选择困难用户的选择菜品以及给出一些用餐健康的参考。 +- 对于系统功能设计:主要包括功能框架和设计模块,其中功能框架主要包括登录模块、注册模块、菜品浏览模块、个人信息模块、选择菜品模块、评论模块和营养成分模块;功能模块涉及分为服务器和客户端,具体包括登录功能、注册功能、个人信息管理功能、菜品浏览功能、评论功能、选择菜品功能和计算营养成分功能。各模块之间互相依赖,形成一个完整的解决餐食问题的系统手机(平板)客户端与服务器的交互设计系统。 + +### 研究内容 + +- A、确立物理架构:Android系统客户端通过无线网络访问后台Web服务器,如果需要数据访问,则访问后台数据库服务器; +- B、确立技术选型:Android客户端选用JAVA技术,网络通信选用 协议,而中间Web服务器采用端口监听响应客户请求。后台数据库使用Litepal来访问数据库,Android客户端部分数据的存储则采用SQLite数据库; +- C、进行系统规划和需求分析,通过数据设计类图分析数据间的关系,设计并创建一个合理可靠的数据库; +- D、实现客户端功能设计,基于Android开发平台,前端客户端功能模块大概分为登录功能、注册功能、菜品浏览功能、更新用户信息功能、选择菜品功能和添加评论功能; +- E、实现服务器端功能设计,后端服务器主要功能操作后端数据库,存储信息,响应客户端发出的请求并给出回馈。 + +### +Author:李雨轩小组全体成员 +设备要求:安卓手机、模拟器或虚拟机 +屏幕分辨率:大于640X480(VGA) +系统要求:Andriod 4.2 及以上 + java 11.0.12 及以上 +使用方法:运行MyApplication.java + road:(liyuxuan_gitProjectsrc/app/src/main/java/com/sbw/atrue/Order/Activity/MyApplication.java) +### \ No newline at end of file diff --git a/model/leitu.png b/model/leitu.png new file mode 100644 index 0000000..3dd73de Binary files /dev/null and b/model/leitu.png differ diff --git a/model/代码组织结构.png b/model/代码组织结构.png new file mode 100644 index 0000000..43d9b32 Binary files /dev/null and b/model/代码组织结构.png differ diff --git a/model/初步用例模型.png b/model/初步用例模型.png new file mode 100644 index 0000000..9f7db18 Binary files /dev/null and b/model/初步用例模型.png differ diff --git a/model/类图-数据设计.png b/model/类图-数据设计.png new file mode 100644 index 0000000..985d29c Binary files /dev/null and b/model/类图-数据设计.png differ diff --git a/model/顺序图-使用健康助手.png b/model/顺序图-使用健康助手.png new file mode 100644 index 0000000..b80599d Binary files /dev/null and b/model/顺序图-使用健康助手.png differ diff --git a/model/顺序图-使用健康助手用例详细设计.png b/model/顺序图-使用健康助手用例详细设计.png new file mode 100644 index 0000000..529f57c Binary files /dev/null and b/model/顺序图-使用健康助手用例详细设计.png differ diff --git a/model/顺序图-更新用户用例详细设计.png b/model/顺序图-更新用户用例详细设计.png new file mode 100644 index 0000000..d8c7c1e Binary files /dev/null and b/model/顺序图-更新用户用例详细设计.png differ diff --git a/model/顺序图-更新用户用例详细设计.png.jpg b/model/顺序图-更新用户用例详细设计.png.jpg new file mode 100644 index 0000000..ebffc15 Binary files /dev/null and b/model/顺序图-更新用户用例详细设计.png.jpg differ diff --git a/model/顺序图-添加评论.png b/model/顺序图-添加评论.png new file mode 100644 index 0000000..5103272 Binary files /dev/null and b/model/顺序图-添加评论.png differ diff --git a/model/顺序图-添加评论用例详细设计.png b/model/顺序图-添加评论用例详细设计.png new file mode 100644 index 0000000..2ea472a Binary files /dev/null and b/model/顺序图-添加评论用例详细设计.png differ diff --git a/other/04_软件工程航吃hang吃汇报PPT.pptx b/other/04_软件工程航吃hang吃汇报PPT.pptx new file mode 100644 index 0000000..34ff827 Binary files /dev/null and b/other/04_软件工程航吃hang吃汇报PPT.pptx differ diff --git a/other/05_软件开发项目的个人自评报告.xlsx b/other/05_软件开发项目的个人自评报告.xlsx new file mode 100644 index 0000000..8471a55 Binary files /dev/null and b/other/05_软件开发项目的个人自评报告.xlsx differ diff --git a/other/06_软件开发项目的团队自评报告.xlsx b/other/06_软件开发项目的团队自评报告.xlsx new file mode 100644 index 0000000..8fa1adc Binary files /dev/null and b/other/06_软件开发项目的团队自评报告.xlsx differ diff --git a/other/07_实践总结报告/07_200340040 张梦瑶-实践总结报告.docx b/other/07_实践总结报告/07_200340040 张梦瑶-实践总结报告.docx new file mode 100644 index 0000000..afe6849 Binary files /dev/null and b/other/07_实践总结报告/07_200340040 张梦瑶-实践总结报告.docx differ diff --git a/other/07_实践总结报告/07_200340060李倩靖-实践总结报告.docx b/other/07_实践总结报告/07_200340060李倩靖-实践总结报告.docx new file mode 100644 index 0000000..4efa9e7 Binary files /dev/null and b/other/07_实践总结报告/07_200340060李倩靖-实践总结报告.docx differ diff --git a/other/07_实践总结报告/07_200340068 沈逸群-实践总结报告.docx b/other/07_实践总结报告/07_200340068 沈逸群-实践总结报告.docx new file mode 100644 index 0000000..52c723f Binary files /dev/null and b/other/07_实践总结报告/07_200340068 沈逸群-实践总结报告.docx differ diff --git a/other/07_实践总结报告/07_200340086 毕晟-实践总结报告.docx b/other/07_实践总结报告/07_200340086 毕晟-实践总结报告.docx new file mode 100644 index 0000000..293a0cb Binary files /dev/null and b/other/07_实践总结报告/07_200340086 毕晟-实践总结报告.docx differ diff --git a/other/07_实践总结报告/07_200340192 乔渝捷-实践总结报告.docx b/other/07_实践总结报告/07_200340192 乔渝捷-实践总结报告.docx new file mode 100644 index 0000000..42aac52 Binary files /dev/null and b/other/07_实践总结报告/07_200340192 乔渝捷-实践总结报告.docx differ diff --git a/other/08_演示运行视频.mp4 b/other/08_演示运行视频.mp4 new file mode 100644 index 0000000..f0c3c08 Binary files /dev/null and b/other/08_演示运行视频.mp4 differ diff --git a/src/app/build.gradle b/src/app/build.gradle index 51690c1..9f98e2f 100644 --- a/src/app/build.gradle +++ b/src/app/build.gradle @@ -19,11 +19,13 @@ android { } dependencies { +// implementation 'org.litepal.android:java:3.0.0' implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.2.0-beta01' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation files('libs\\mysql-connector-java-5.1.38.jar') implementation files('libs\\mysql-connector-java-5.1.38.jar') + implementation files('libs\\litepal-2.0.0-src.jar') testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.3.0-beta01' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0-beta01' @@ -33,8 +35,9 @@ dependencies { implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'com.github.bumptech.glide:glide:4.11.0' - implementation 'org.litepal.android:core:1.3.2' - /*implementation 'org.litepal.guolindev:core:3.2.3'*/ +// implementation 'org.litepal.android:core:1.3.2' +// implementation 'org.litepal.guolindev:core:3.2.3' + implementation 'com.yanzhenjie.nohttp:nohttp:1.1.4' implementation 'com.google.code.gson:gson:2.8.6' } diff --git a/src/app/libs/litepal-2.0.0-src.jar b/src/app/libs/litepal-2.0.0-src.jar new file mode 100644 index 0000000..bd4d461 Binary files /dev/null and b/src/app/libs/litepal-2.0.0-src.jar differ diff --git a/src/app/src/main/AndroidManifest.xml b/src/app/src/main/AndroidManifest.xml index 412bda6..f5e28d9 100644 --- a/src/app/src/main/AndroidManifest.xml +++ b/src/app/src/main/AndroidManifest.xml @@ -1,56 +1,51 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/CommentActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/CommentActivity.java new file mode 100644 index 0000000..36905d3 --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/CommentActivity.java @@ -0,0 +1,122 @@ +package com.sbw.atrue.Order.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.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.sbw.atrue.Order.R; +import com.sbw.atrue.Order.Util.AdapterComment; +import com.sbw.atrue.Order.Entity.Comment; + +import java.util.ArrayList; +import java.util.List; + +public class CommentActivity extends Activity implements View.OnClickListener { + + private ImageView comment; + private TextView hide_down; + private EditText comment_content; + private Button comment_send; + + private LinearLayout rl_enroll; + private RelativeLayout rl_comment; + + private ListView comment_list; + private AdapterComment adapterComment; + private List data; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + initView(); + } + + private void initView() { + + // 初始化评论列表 + comment_list = (ListView) findViewById(R.id.comment_list); + // 初始化数据 + data = new ArrayList<>(); + // 初始化适配器 + adapterComment = new AdapterComment(getApplicationContext(), data); + // 为评论列表设置适配器 + comment_list.setAdapter(adapterComment); + + comment = (ImageView) findViewById(R.id.comment); + hide_down = (TextView) findViewById(R.id.hide_down); + comment_content = (EditText) findViewById(R.id.comment_content); + comment_send = (Button) findViewById(R.id.comment_send); + + rl_enroll = (LinearLayout) findViewById(R.id.rl_enroll); + rl_comment = (RelativeLayout) findViewById(R.id.rl_comment); + + setListener(); + } + + /** + * 设置监听 + */ + public void setListener(){ + comment.setOnClickListener(this); + + hide_down.setOnClickListener(this); + comment_send.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.comment: + // 弹出输入法 + InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + // 显示评论框 + rl_enroll.setVisibility(View.GONE); + rl_comment.setVisibility(View.VISIBLE); + break; + case R.id.hide_down: + // 隐藏评论框 + rl_enroll.setVisibility(View.VISIBLE); + rl_comment.setVisibility(View.GONE); + // 隐藏输入法,然后暂存当前输入框的内容,方便下次使用 + InputMethodManager im = (InputMethodManager)getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); + im.hideSoftInputFromWindow(comment_content.getWindowToken(), 0); + break; + case R.id.comment_send: + sendComment(); + break; + default: + break; + } + } + + /** + * 发送评论 + */ + public void sendComment(){ + if(comment_content.getText().toString().equals("")){ + Toast.makeText(getApplicationContext(), "评论不能为空!", Toast.LENGTH_SHORT).show(); + }else{ + // 生成评论数据 + Comment comment = new Comment(); + comment.setName("评论者"+(data.size()+1)+":"); + comment.setContent(comment_content.getText().toString()); + adapterComment.addComment(comment); + // 发送完,清空输入框 + comment_content.setText(""); + + Toast.makeText(getApplicationContext(), "评论成功!", Toast.LENGTH_SHORT).show(); + } + } +} \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/FoodActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/FoodActivity.java index 6c6bdf1..cf0afd2 100644 --- a/src/app/src/main/java/com/sbw/atrue/Order/Activity/FoodActivity.java +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/FoodActivity.java @@ -7,6 +7,8 @@ import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; +import android.view.View; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -19,13 +21,16 @@ import com.sbw.atrue.Order.R; * description: 用于加载展示菜品的详细信息的活动
*/ public class FoodActivity extends AppCompatActivity { +// private Button btCommenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + initEvents(); setContentView(R.layout.activity_food); // 这里连到界面 //获取各布局控件的实例 CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); +// btCommenter = (Button) findViewById(R.id.commerter); ImageView foodImageView = (ImageView) findViewById(R.id.food_image_view); TextView foodContentText = (TextView) findViewById(R.id.food_content_text); @@ -62,4 +67,19 @@ public class FoodActivity extends AppCompatActivity { } return super.onOptionsItemSelected(item); } + private void initEvents() { +/* btCommenter.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + startActivity(new Intent(FoodActivity.this, CommentActivity.class)); + } + });*/ +/* btCommenter.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(FoodActivity.this, RegisterActivity.class)); + } + });*/ + } } diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivity.java index c2975b6..1ef6f12 100644 --- a/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivity.java +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivity.java @@ -36,6 +36,7 @@ public class LoginActivity extends AppCompatActivity { private EditText passwordEdit; private Button btnlogin; private Button btnRegister; +// private Button btCommenter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -51,6 +52,7 @@ public class LoginActivity extends AppCompatActivity { passwordEdit = (EditText) findViewById(R.id.password); btnlogin = (Button) findViewById(R.id.login); btnRegister = (Button) findViewById(R.id.register); +// btCommenter = (Button) findViewById(R.id.commerter); } //初始化控件事件 @@ -81,6 +83,14 @@ public class LoginActivity extends AppCompatActivity { LoginActivity.this.finish(); //结束当前界面 } }); + +// btCommenter.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// //跳转到注册界面 +// startActivity(new Intent(LoginActivity.this, CommentActivity.class)); +// } +// }); } /** diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivityy.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivityy.java deleted file mode 100644 index c405182..0000000 --- a/src/app/src/main/java/com/sbw/atrue/Order/Activity/LoginActivityy.java +++ /dev/null @@ -1,515 +0,0 @@ -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.annotation.TargetApi; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.graphics.Color; -import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; -import android.app.LoaderManager.LoaderCallbacks; - -import android.content.CursorLoader; -import android.content.Loader; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; - -import android.os.Build; -import android.os.Bundle; -import android.provider.ContactsContract; -import android.text.TextUtils; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.inputmethod.EditorInfo; -import android.widget.ArrayAdapter; -import android.widget.AutoCompleteTextView; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import com.android.volley.AuthFailureError; -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.StringRequest; -import com.android.volley.toolbox.Volley; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -import static android.Manifest.permission.READ_CONTACTS; - -/** - * A login screen that offers login via name/password. - * 通过账号/密码提供登录的登录屏幕。 - */ -public class LoginActivity extends AppCompatActivity implements LoaderCallbacks { - - /** - * Id to identity READ_CONTACTS permission request. - * ID来标识READ_CONTACTS权限请求。 - */ - private static final int REQUEST_READ_CONTACTS = 0; - - /** - * A dummy authentication store containing known user names and passwords. - * 包含已知用户名和密码的虚假认证存储。 - * TODO: remove after connecting to a real authentication system. - * 连接到真实身份验证系统后删除。 - */ - private static final String[] DUMMY_CREDENTIALS = new String[]{ - "foo@example.com:hello", "bar@example.com:world", - //DUMMY_CREDENTTALS用于模拟已存在的账户,冒号前为账户,冒号后为密码 - }; - /** - * Keep track of the login task to ensure we can cancel it if requested. - * 跟踪登录任务以确保我们可以根据请求取消它。 - */ - private UserLoginTask mAuthTask = null; - - // UI references. - private AutoCompleteTextView mUserNameView; - private EditText mPasswordView; - private View mProgressView; - private View mLoginFormView; - - private SharedPreferences preferences; - private SharedPreferences.Editor editor; - //记住密码 - private CheckBox rememberPass; - //自动登录 - private CheckBox autoLogin; - - @Override - protected void onCreate(Bundle savedInstanceState) { - if (Build.VERSION.SDK_INT >= 21) { - View decorView = getWindow().getDecorView(); - decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); - getWindow().setStatusBarColor(Color.TRANSPARENT); - } - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_login); - preferences = PreferenceManager.getDefaultSharedPreferences(this); - // Set up the login form. 设置登录表单 - - rememberPass = (CheckBox) findViewById(R.id.remember_pass); - autoLogin = (CheckBox) findViewById(R.id.auto_login); - //账号输入 - mUserNameView = (AutoCompleteTextView) findViewById(R.id.UserName); - populateAutoComplete(); - //密码输入 - mPasswordView = (EditText) findViewById(R.id.password); - mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { - if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) { - attemptLogin(); - return true; - } - return false; - } - }); - - //记住密码 - boolean isRemember = preferences.getBoolean("remember_password",false); - boolean isAutoLogin = preferences.getBoolean("auto_Login",false); - if(isRemember ) { - //将账户和密码都设置到文本框中 - String account = preferences.getString("UserName", ""); - String password = preferences.getString("password", ""); - mUserNameView.setText(account); - mPasswordView.setText(password); - rememberPass.setChecked(true); - //自动登录 - if (isAutoLogin) { - Intent intent = new Intent(LoginActivity.this, MainActivity.class); - LoginActivity.this.startActivity(intent); - Toast.makeText(getApplicationContext(), "自动登录", Toast.LENGTH_SHORT).show(); - } - } - //登录按钮 - Button mUserNameSignInButton = (Button) findViewById(R.id.UserName_sign_in_button); - mUserNameSignInButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - attemptLogin(); - } - }); - //注册按钮 - Button register = (Button) findViewById(R.id.register); - register.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(LoginActivity.this,registerActivity.class); - startActivity(intent); - } - }); - - //方法最后两个mLoginFormView和mProgressView是用于获取显示的View, - //在登陆的时候可以进行登陆窗口gone,ProgressBar visible的操作。 - mLoginFormView = findViewById(R.id.login_form); - mProgressView = findViewById(R.id.login_progress); - } - - //先是通过mayRequestContacts判断是否继续执行,若通过判断则初始化Loaders,通过Loaders后台异步读取用户的账户信息。 - private void populateAutoComplete() { - if (!mayRequestContacts()) { - return; - } - - getLoaderManager().initLoader(0, null, this); - } - - //这个方法是用于请求用户以获取读取账户的权限,主要是为了适配6.0新的权限机制 - private boolean mayRequestContacts() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return true; - } - if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { - return true; - } - if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { - Snackbar.make(mUserNameView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) - .setAction(android.R.string.ok, new View.OnClickListener() { - @Override - @TargetApi(Build.VERSION_CODES.M) - public void onClick(View v) { - requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); - } - }); - } else { - requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); - } - return false; - } - - /** - * Callback received when a permissions request has been completed. - * 当权限请求已完成时收到回调。 - */ - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - if (requestCode == REQUEST_READ_CONTACTS) { - if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - populateAutoComplete(); - } - } - } - - - /** - * Attempts to sign in or register the account specified by the login form. - * 尝试登录或注册登录表单指定的帐户。 - * If there are form errors (invalid UserName, missing fields, etc.), the - * 如果有表单错误(无效的电子邮件,缺少字段等) - * errors are presented and no actual login attempt is made. - * 出现错误并且没有进行实际的登录尝试。 - */ - private void attemptLogin() { - if (mAuthTask != null) { - return; - } - - // Reset errors.重置错误。 - mUserNameView.setError(null); - mPasswordView.setError(null); - - - // Store values at the time of the login attempt.在登录尝试时存储值。 - String UserName = mUserNameView.getText().toString(); - String password = mPasswordView.getText().toString(); - editor = preferences.edit(); - if(autoLogin.isChecked()){ - editor.putBoolean("auto_Login",true); - } - if (rememberPass.isChecked()) { - editor.putBoolean("remember_password", true); - editor.putString("UserName", UserName); - editor.putString("password", password); - } else { - editor.clear(); - } - editor.apply(); - - boolean cancel = false; - View focusView = null; - - // Check for a valid password, if the user entered one.如果用户输入密码,请检查有效的密码。 - if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { - mPasswordView.setError(getString(R.string.error_invalid_password)); - focusView = mPasswordView; - cancel = true; - } - - // Check - if (TextUtils.isEmpty(UserName)) { - mUserNameView.setError(getString(R.string.error_field_required)); - focusView = mUserNameView; - cancel = true; - } else if (!isUserNameValid(UserName)) { - mUserNameView.setError(getString(R.string.error_invalid_UserName)); - focusView = mUserNameView; - cancel = true; - } - - if (cancel) { - // There was an error; don't attempt login and focus the first - //有一个错误;不要尝试登录并首先关注 - // form field with an error. - //表单字段有错误。 - focusView.requestFocus(); - } else { - // Show a progress spinner, and kick off a background task to - //显示进度微调,并启动后台任务 - // perform the user login attempt. - //执行用户登录尝试。 - showProgress(true); - mAuthTask = new UserLoginTask(UserName, password); - mAuthTask.execute((Void) null); - - } - } - - private boolean isUserNameValid(String UserName) { - //TODO: Replace this with your own logic 用你自己的逻辑代替这个 - return UserName.contains("@"); - } - - private boolean isPasswordValid(String password) { - //TODO: Replace this with your own logic 用你自己的逻辑代替这个 - return password.length() > 4; - } - - /** - * Shows the progress UI and hides the login form. - * 显示进度UI并隐藏登录表单。 - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) - private void showProgress(final boolean show) { - // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow - // for very easy animations. If available, use these APIs to fade-in - // the progress spinner. - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { - int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); - - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - mLoginFormView.animate().setDuration(shortAnimTime).alpha( - show ? 0 : 1).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - } - }); - - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mProgressView.animate().setDuration(shortAnimTime).alpha( - show ? 1 : 0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - } - }); - } else { - // The ViewPropertyAnimator APIs are not available, so simply show - // and hide the relevant UI components. - //ViewPropertyAnimator API不可用,因此只需显示和隐藏相关的UI组件。 - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - } - } - - @Override - public Loader onCreateLoader(int i, Bundle bundle) { - return new CursorLoader(this, - // Retrieve data rows for the device user's 'profile' contact. - //检索设备用户的“个人资料”联系人的数据行。 - Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, - ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, - - ContactsContract.Contacts.Data.MIMETYPE + - " = ?", new String[]{ContactsContract.CommonDataKinds.UserName - .CONTENT_ITEM_TYPE}, - - ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); - } - - @Override - public void onLoadFinished(Loader cursorLoader, Cursor cursor) { - List UserNames = new ArrayList<>(); - cursor.moveToFirst(); - while (!cursor.isAfterLast()) { - UserNames.add(cursor.getString(ProfileQuery.ADDRESS)); - cursor.moveToNext(); - } - - addUserNamesToAutoComplete(UserNames); - } - - @Override - public void onLoaderReset(Loader cursorLoader) { - - } - - private void addUserNamesToAutoComplete(List UserNameAddressCollection) { - //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. - //创建适配器以告诉AutoCompleteTextView在其下拉列表中显示什么。 - ArrayAdapter adapter = - new ArrayAdapter<>(LoginActivity.this, - android.R.layout.simple_dropdown_item_1line, UserNameAddressCollection); - - mUserNameView.setAdapter(adapter); - } - - - private interface ProfileQuery { - String[] PROJECTION = { - ContactsContract.CommonDataKinds.UserName.ADDRESS, - ContactsContract.CommonDataKinds.UserName.IS_PRIMARY, - }; - - int ADDRESS = 0; - int IS_PRIMARY = 1; - } - - /** - * Represents an asynchronous login/registration task used to authenticate - * the user. - * 表示用于验证用户的异步登录/注册任务。 - */ - public class UserLoginTask extends AsyncTask { - - private final String mUserName; - private final String mPassword; - - UserLoginTask(String UserName, String password) { - mUserName = UserName; - mPassword = password; - } - - @Override - protected Boolean doInBackground(Void... params) { - // TODO: attempt authentication against a network service. - //尝试对网络服务进行身份验证。 - - try { - LoginRequest(mUserName,mPassword); - - - - // Simulate network access.模拟网络访问。 - Thread.sleep(3000); - } catch (InterruptedException e) { - return false; - } - - for (String credential : DUMMY_CREDENTIALS) { - String[] pieces = credential.split(":"); - if (pieces[0].equals(mUserName)) { - // Account exists, return true if the password matches. - //帐户存在,如果密码匹配则返回true。 - return pieces[1].equals(mPassword); - } - } - - // TODO: register the new account here. - //在此注册新帐户。 - return true; - } - - @Override - protected void onPostExecute(final Boolean success) { - mAuthTask = null; - showProgress(false); - - if (success) { - /* - Intent intent = new Intent(LoginActivity.this,MainActivity.class); - startActivity(intent); - finish(); - */ - } else { - mPasswordView.setError(getString(R.string.error_incorrect_password)); - mPasswordView.requestFocus(); - } - } - - @Override - protected void onCancelled() { - mAuthTask = null; - showProgress(false); - } - } - - public void LoginRequest(final String account, final String password) { - //请求地址 - String url = "http://8.130.38.15:8080/Whoere/LoginServlet?account="+account+"&password="+password; - String tag = "Login"; - - //取得请求队列 - RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); - - //防止重复请求,所以先取消tag标识的请求队列 - requestQueue.cancelAll(tag); - - //创建StringRequest,定义字符串请求的请求方式为POST(省略第一个参数会默认为GET方式) - final StringRequest request = new StringRequest(Request.Method.POST, url, - new Response.Listener() { - //@Override - public void onResponse(String response) { - try { - JSONObject jsonObject = (JSONObject) new JSONObject(response).get("params"); - String result = jsonObject.getString("Result"); - if (result.equals("success")) { - //做自己的登录成功操作,如页面跳转 - Intent intent = new Intent(LoginActivity.this,MainActivity.class); - startActivity(intent); - Toast.makeText(LoginActivity.this,"欢迎!",Toast.LENGTH_LONG).show(); - } else { - if (result.equals("failed")) - Toast.makeText(LoginActivity.this,"账户或密码错误!",Toast.LENGTH_SHORT).show(); - } - } catch (JSONException e) { - //做自己的请求异常操作,如Toast提示(“无网络连接”等) - Log.e("TAG", e.getMessage(), e); - } - } - }, new Response.ErrorListener() { - //@Override - public void onErrorResponse(VolleyError error) { - //做自己的响应错误操作,如Toast提示(“请稍后重试”等) - Log.e("TAG", error.getMessage(), error); - } - }) { - @Override - protected Map getParams() { - Map params = new HashMap<>(); - params.put("Account", account); - params.put("Password", password); - return params; - } - }; - - //设置Tag标签 - request.setTag(tag); - - //将请求添加到队列中 - requestQueue.add(request); - } -} \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/MainActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/MainActivity.java new file mode 100644 index 0000000..b89acd9 --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/MainActivity.java @@ -0,0 +1,16 @@ +package com.sbw.atrue.Order.Activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; + +import com.sbw.atrue.Order.R; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main2); + } +} \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/OrderActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/OrderActivity.java index 7c4c508..6a63079 100644 --- a/src/app/src/main/java/com/sbw/atrue/Order/Activity/OrderActivity.java +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/OrderActivity.java @@ -109,7 +109,6 @@ public class OrderActivity extends AppCompatActivity { startActivity(intent); } }); - break; case R.id.nav_money: //跳转到钱包界面 @@ -386,11 +385,17 @@ public class OrderActivity extends AppCompatActivity { case R.id.backup: Toast.makeText(this, "You click Backup", Toast.LENGTH_SHORT).show(); break; - case R.id.delete: + /* case R.id.delete: Toast.makeText(this, "You click Delete", Toast.LENGTH_SHORT).show(); break; case R.id.setting: Toast.makeText(this, "You click Setting", Toast.LENGTH_SHORT).show(); + break;*/ + case R.id.comment: + startActivity(new Intent(OrderActivity.this, CommentActivity.class)); + break; + case R.id.turntable: + startActivity(new Intent(OrderActivity.this, TurnActivity.class)); break; default: } diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/ReadOrderActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/ReadOrderActivity.java index 878a43f..43250df 100644 --- a/src/app/src/main/java/com/sbw/atrue/Order/Activity/ReadOrderActivity.java +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/ReadOrderActivity.java @@ -9,6 +9,8 @@ import com.sbw.atrue.Order.Entity.Product; import com.sbw.atrue.Order.Entity.ProductOrder; import com.sbw.atrue.Order.R; +//import org.litepal.crud.DataSupport; + import org.litepal.crud.DataSupport; import java.util.List; @@ -38,7 +40,7 @@ public class ReadOrderActivity extends Activity { */ private void readFromSqlite(){ //从SQLite数据库读取历史订单列表 - List orders=DataSupport.findAll(Order.class); + List orders= DataSupport.findAll(Order.class); //遍历订单列表并输出订单信息 for(Order order:orders){ StringBuilder orderResult = new StringBuilder(); //新建订单结果信息 diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/TurnActivity.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/TurnActivity.java new file mode 100644 index 0000000..ea7066f --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/TurnActivity.java @@ -0,0 +1,43 @@ +package com.sbw.atrue.Order.Activity; + +import android.os.Bundle; +//import android.support.v7.app.AppCompatActivity; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.sbw.atrue.Order.R; +import com.sbw.atrue.Order.Util.LuckyView; +//import com.showly.luckyactivity.view.LuckyView; + +public class TurnActivity extends AppCompatActivity { + + private LuckyView luckyView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_turnable); + + initView(); + initData(); + initListener(); + } + + private void initView() { + luckyView = findViewById(R.id.lucky_view); + } + + private void initData() { + + } + + private void initListener() { + luckyView.setLuckAnimationEndListener(new LuckyView.OnLuckAnimationEndListener() { + @Override + public void onLuckAnimationEnd(int pos, String msg) { + Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); + } + }); + } +} diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Activity/horizonta_main.java b/src/app/src/main/java/com/sbw/atrue/Order/Activity/horizonta_main.java index 9b62648..7239634 100644 --- a/src/app/src/main/java/com/sbw/atrue/Order/Activity/horizonta_main.java +++ b/src/app/src/main/java/com/sbw/atrue/Order/Activity/horizonta_main.java @@ -14,22 +14,26 @@ import com.sbw.atrue.Order.Activity.CustomHorizontalProgresWithNum; import com.sbw.atrue.Order.R; public class horizonta_main extends AppCompatActivity { - private CustomHorizontalProgresNoNum horizontalProgress01;//水平不带进度 - private CustomHorizontalProgresWithNum horizontalProgress1,horizontalProgress2,horizontalProgress3;//水平带进度 - private Timer timer,timer2,timer3; +// private CustomHorizontalProgresWithNum horizontalProgress01;//水平不带进度 + private CustomHorizontalProgresWithNum horizontalProgress01, horizontalProgress1,horizontalProgress2,horizontalProgress3;//水平带进度 + private Timer timer; + private Timer timer1; + private Timer timer2; + private Timer timer3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); setContentView(R.layout.horizontalprogres); - horizontalProgress01 = (CustomHorizontalProgresNoNum) findViewById(R.id.horizontalProgress01); - - + horizontalProgress01 = (CustomHorizontalProgresWithNum) findViewById(R.id.horizontalProgress01); horizontalProgress1 = (CustomHorizontalProgresWithNum) findViewById(R.id.horizontalProgress1); horizontalProgress2 = (CustomHorizontalProgresWithNum) findViewById(R.id.horizontalProgress2); horizontalProgress3 = (CustomHorizontalProgresWithNum) findViewById(R.id.horizontalProgress3); + horizontalProgress01.setProgress(0); + horizontalProgress01.setMax(100); + horizontalProgress1.setProgress(0); horizontalProgress1.setMax(100); @@ -39,18 +43,43 @@ public class horizonta_main extends AppCompatActivity { horizontalProgress3.setProgress(0); horizontalProgress3.setMax(200); +/* + + Timer timer1 = new Timer(); + timer1.schedule(new TimerTask() { + @Override + public void run() { + //实时更新进度 + if (horizontalProgress1.getProgress() >= 10) {//指定时间取消 + timer.cancel(); + } + horizontalProgress1.setProgress(horizontalProgress1.getProgress()+1); + } + }, 50, 50); +*/ + + timer1 = new Timer(); + final Timer finalTimer = timer1; + timer1.schedule(new TimerTask() { + @Override + public void run() { + //实时更新进度 + if (horizontalProgress1.getProgress() >= 12) {//指定时间取消 + finalTimer.cancel(); + } + horizontalProgress1.setProgress(horizontalProgress1.getProgress()+1); + } + }, 50, 50); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { //实时更新进度 - if (horizontalProgress1.getProgress() >= 100) {//指定时间取消 + if (horizontalProgress1.getProgress() >= 25) {//指定时间取消 timer.cancel(); } horizontalProgress1.setProgress(horizontalProgress1.getProgress()+1); - horizontalProgress01.setProgress(horizontalProgress01.getProgress()+1); - } }, 50, 50); @@ -59,13 +88,13 @@ public class horizonta_main extends AppCompatActivity { @Override public void run() { //实时更新进度 - if (horizontalProgress2.getProgress() >= 100) {//指定时间取消 + if (horizontalProgress2.getProgress() >= 15) {//指定时间取消 timer2.cancel(); } horizontalProgress2.setProgress(horizontalProgress2.getProgress()+1); } - }, 40, 40); + }, 50, 50); timer3 = new Timer(); @@ -73,7 +102,7 @@ public class horizonta_main extends AppCompatActivity { @Override public void run() { //实时更新进度 - if (horizontalProgress3.getProgress() >= horizontalProgress3.getMax()) {//指定时间取消 + if (horizontalProgress3.getProgress() >= 57) {//指定时间取消 timer3.cancel(); } horizontalProgress3.setProgress(horizontalProgress3.getProgress()+1); @@ -81,6 +110,4 @@ public class horizonta_main extends AppCompatActivity { } }, 50, 50); } - - } diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Entity/Comment.java b/src/app/src/main/java/com/sbw/atrue/Order/Entity/Comment.java new file mode 100644 index 0000000..1d6c765 --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Entity/Comment.java @@ -0,0 +1,33 @@ +package com.sbw.atrue.Order.Entity; + + +public class Comment { + + String name; //评论者 + String content; //评论内容 + + public Comment(){ + + } + + public Comment(String name, String content){ + this.name = name; + this.content = content; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Entity/Custom.java b/src/app/src/main/java/com/sbw/atrue/Order/Entity/Custom.java new file mode 100644 index 0000000..fa50be7 --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Entity/Custom.java @@ -0,0 +1,8 @@ +package com.sbw.atrue.Order.Entity; + +import org.litepal.LitePalApplication; + +public class Custom extends LitePalApplication { + + +} diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Util/AdapterComment.java b/src/app/src/main/java/com/sbw/atrue/Order/Util/AdapterComment.java new file mode 100644 index 0000000..84237f4 --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Util/AdapterComment.java @@ -0,0 +1,81 @@ +package com.sbw.atrue.Order.Util; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.sbw.atrue.Order.Util.AdapterComment; +import com.sbw.atrue.Order.Entity.Comment; +import com.sbw.atrue.Order.R; + +import java.util.List; + +/** + * Created by yyp on 2016/8/10. + */ +public class AdapterComment extends BaseAdapter { + + Context context; + List data; + + public AdapterComment(Context c, List data){ + this.context = c; + this.data = data; + } + + @Override + public int getCount() { + return data.size(); + } + + @Override + public Object getItem(int i) { + return data.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View convertView, ViewGroup viewGroup) { + ViewHolder holder; + // 重用convertView + if(convertView == null){ + holder = new ViewHolder(); + convertView = LayoutInflater.from(context).inflate(R.layout.item_comment, null); + holder.comment_name = (TextView) convertView.findViewById(R.id.comment_name); + holder.comment_content = (TextView) convertView.findViewById(R.id.comment_content); + + convertView.setTag(holder); + }else{ + holder = (ViewHolder) convertView.getTag(); + } + // 适配数据 + holder.comment_name.setText(data.get(i).getName()); + holder.comment_content.setText(data.get(i).getContent()); + + return convertView; + } + + /** + * 添加一条评论,刷新列表 + * @param comment + */ + public void addComment(Comment comment){ + data.add(comment); + notifyDataSetChanged(); + } + + /** + * 静态类,便于GC回收 + */ + public static class ViewHolder{ + TextView comment_name; + TextView comment_content; + } +} diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Util/LoginServlet.java b/src/app/src/main/java/com/sbw/atrue/Order/Util/LoginServlet.java deleted file mode 100644 index 15b39b7..0000000 --- a/src/app/src/main/java/com/sbw/atrue/Order/Util/LoginServlet.java +++ /dev/null @@ -1,56 +0,0 @@ -import java.io.IOException; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import net.sf.json.JSONObject; - - -public class LoginServlet extends HttpServlet { - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - // 设置响应内容类型 - response.setContentType("text/html;charset=utf-8"); - request.setCharacterEncoding("utf-8"); - response.setCharacterEncoding("utf-8"); - - try (PrintWriter out = response.getWriter()) { - - //获得请求中传来的用户名和密码 - String account = request.getParameter("account").trim(); - String password = request.getParameter("password").trim(); - - //密码验证结果 - Boolean verifyResult = verifyLogin(account, password); - - Map params = new HashMap<>(); - JSONObject jsonObject = new JSONObject(); - - if (verifyResult) { - params.put("Result", "success"); - } else { - params.put("Result", "failed"); - } - - jsonObject.put("params", params); - out.write(jsonObject.toString()); - } - } - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - doPost(request, response); - } - //验证用户名密码是否正确 - private Boolean verifyLogin(String userName, String password) { - User user = UserDAO.queryUser(userName); - //账户密码验证 - return null != user && password.equals(user.getPassword()); - } -} \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Util/LuckyView.java b/src/app/src/main/java/com/sbw/atrue/Order/Util/LuckyView.java new file mode 100644 index 0000000..007566f --- /dev/null +++ b/src/app/src/main/java/com/sbw/atrue/Order/Util/LuckyView.java @@ -0,0 +1,309 @@ +package com.sbw.atrue.Order.Util; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +//import com.showly.luckyactivity.R; + +import com.sbw.atrue.Order.R; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class LuckyView extends View { + private Paint mPaint; + private float mStrokeWidth = 5; + private int mRepeatCount = 5; // 转的圈数 + private int mRectSize; // 矩形的宽和高(矩形为正方形) + private boolean mShouldStartFlag; + private boolean mShouldStartNextTurn = true; // 标记是否应该开启下一轮抽奖 + private int mStartLuckPosition = 0; // 开始抽奖的位置 + private int mCurrentPosition = -1; // 当前转圈所在的位置 + + private OnLuckAnimationEndListener mLuckAnimationEndListener; + + /** + * 可以通过对 mLuckNum 设置计算策略,来控制用户 中哪些奖 以及 中大奖 的概率 + */ + private int mLuckNum = 3; // 默认最终中奖位置 + + private List mRectFs; // 存储矩形的集合 + private int[] mItemColor = {Color.parseColor("#ffefd6"), Color.parseColor("#ffefd6")}; // 矩形的颜色 + private String[] mPrizeDescription = {"南一食堂", "南二食堂", "南三食堂", "北二食堂", "再来一次", "北三食堂", "中餐厅", "北一食堂", "开始"}; + private int[] mLuckyPrizes = {R.drawable.nan1, R.drawable.nan2, R.drawable.nan3, R.drawable + .bei2, R.drawable.again, R.drawable.bei3, R.drawable.zhong, R.drawable.bei1 ,R + .drawable.begin}; + private List lettersBeans; + private float left; + private float top; + private Bitmap[] bitmaps; + private String[] luckyName; + private String[] id; + private int selectPos; + + + public LuckyView(Context context) { + this(context, null); + } + + public LuckyView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public LuckyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿 + mPaint.setStyle(Paint.Style.FILL); + // mPaint.setStyle(Paint.Style.STROKE); // 设置样式为描边 + mPaint.setStrokeWidth(mStrokeWidth); // 设置描边的宽度 + + mRectFs = new ArrayList<>(); + } + + public void setLuckAnimationEndListener(OnLuckAnimationEndListener luckAnimationEndListener) { + mLuckAnimationEndListener = luckAnimationEndListener; + } + + public int getLuckNum() { + return mLuckNum; + } + + public void setLuckNum(int luckNum) { + mLuckNum = luckNum; + } + + public int[] getLuckyPrizes() { + return mLuckyPrizes; + } + + public void setLuckyPrizes(int[] luckyPrizes) { + mLuckyPrizes = luckyPrizes; + } + + public void setData(List lettersBeans) { + this.lettersBeans = lettersBeans; + invalidate(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mRectSize = (Math.min(w, h)) / 3; // 矩形的宽高 + + mRectFs.clear(); // 当控件大小改变的时候清空数据 + initNineRect(); + } + + /** + * 初始化 9 个矩形(正方形)的位置信息 + */ + private void initNineRect() { + final float width = getWidth(); + + // 加载前三个矩形 + for (int i = 0; i < 3; i++) { + float left = i * mRectSize + 5; + float right = (i + 1) * mRectSize; + float top = 5; + float bottom = mRectSize; + RectF rectF = new RectF(left, top, right, bottom); + mRectFs.add(rectF); + } + + // 加载第 4 个矩形 + mRectFs.add(new RectF(width - mRectSize + 5, mRectSize + 5, width, 2 * mRectSize)); + + // 加载第 5~7 个矩形 + for (int j = 3; j > 0; j--) { + float left = width - (4 - j) * mRectSize + 5; + float right = width - (3 - j) * mRectSize; + float top = 2 * mRectSize + 5; + float bottom = 3 * mRectSize; + RectF rectF = new RectF(left, top, right, bottom); + mRectFs.add(rectF); + } + + // 加载第 8 个矩形 + mRectFs.add(new RectF(5, mRectSize + 5, mRectSize, 2 * mRectSize)); + + // 加载中心第 9 个矩形 + mRectFs.add(new RectF(mRectSize + 5, mRectSize + 5, 2 * mRectSize, 2 * mRectSize)); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + drawNineRect(canvas); + drawNineBitmaps(canvas); // 填充奖品图片 + drawNineText(canvas); // 填充奖品文字 + } + + /** + * 在每个矩形中填充奖品图片 + * left:The position of the left side of the bitmap being drawn + * top:The position of the top side of the bitmap being drawn + */ + private void drawNineBitmaps(final Canvas canvas) { + + for (int i = 0; i < mRectFs.size(); i++) { + RectF rectF = mRectFs.get(i); + // 将图片设置在每个矩形中央 + left = rectF.left + mRectSize / 4; + top = rectF.top + mRectSize / 4; + canvas.drawBitmap(Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), mLuckyPrizes[i]), mRectSize / 2, mRectSize / 2, false), left, top, null); + } + } + + + /** + * 在每个矩形中央填充文字,代替抽奖图片 + * x:he x-coordinate of the origin of the text being drawn + * y:The y-coordinate of the baseline of the text being drawn + */ + private void drawNineText(Canvas canvas) { + for (int i = 0; i < mRectFs.size(); i++) { + RectF rectF = mRectFs.get(i); + float x = rectF.left + mRectSize / 4; // 将文字设置在每个矩形中央 + float y = rectF.top + mRectSize - 20; + mPaint.setColor(Color.parseColor("#5e5448")); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setTextSize(30); // unit px + if (i == mRectFs.size() - 1) { + canvas.drawText("", x, y, mPaint); + } else { + canvas.drawText(mPrizeDescription[i], x, y, mPaint); + } + } + } + + /** + * 执行真正的绘制矩形操作 + */ + private void drawNineRect(Canvas canvas) { + for (int x = 0; x < mRectFs.size(); x++) { + RectF rectF = mRectFs.get(x); + if (x == 8) { + mPaint.setColor(Color.WHITE); + } else { + if (mCurrentPosition == x) { + mPaint.setColor(Color.parseColor("#edcea9")); + } else { + mPaint.setColor(mItemColor[x % 2]); // 标记当前转盘经过的位置 + } + } + canvas.drawRect(rectF, mPaint); + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mShouldStartFlag = mRectFs.get(8).contains(event.getX(), event.getY()); + return true; + } + if (event.getAction() == MotionEvent.ACTION_UP) { + if (mShouldStartFlag) { + if (mRectFs.get(8).contains(event.getX(), event.getY())) { + // mLuckAnimationEndListener.onClickLuck(); + startAnim(); // 判断只有手指落下和抬起都在中间的矩形内时才开始执行动画抽奖 + } + mShouldStartFlag = false; + } + } + return super.onTouchEvent(event); + } + + private void startAnim() { + if (!mShouldStartNextTurn) { + return; + } + Random random = new Random(); + setLuckNum(random.nextInt(8)); // 生成 [0,8) 的随机整数 + + ValueAnimator animator = ValueAnimator.ofInt(mStartLuckPosition, mRepeatCount * 8 + mLuckNum) + .setDuration(5000); + + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + final int position = (int) animation.getAnimatedValue(); + setCurrentPosition(position % 8); + mShouldStartNextTurn = false; + } + }); + + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mShouldStartNextTurn = true; + mStartLuckPosition = mLuckNum; + //最终选中的位置 + if (mLuckAnimationEndListener != null) { + mLuckAnimationEndListener.onLuckAnimationEnd(mCurrentPosition, + mPrizeDescription[mCurrentPosition]); + } + } + }); + + animator.start(); + } + + private void setCurrentPosition(int position) { + mCurrentPosition = position; + invalidate(); // 强制刷新,在 UI 线程回调 onDraw() + } + + public void setBitmap(Bitmap[] bitmaps1, String[] name, String[] strings) { + bitmaps = bitmaps1; + luckyName = name; + id = strings; + invalidate(); + } + + /** + * 选中id + * + * @param datas + */ + public void setSelectId(int datas) { + String selectId = datas + ""; + + if (id != null && id.length != 0) { + for (int i = 0; i < id.length; i++) { + if (id[i].equals(selectId)) { + selectPos = i; + } + } + } + + startAnim(); + } + + /** + * 用于抽奖结果回调 + */ + public interface OnLuckAnimationEndListener { + void onLuckAnimationEnd(int pos, String msg); + } +} diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Util/RegisterServlet.java b/src/app/src/main/java/com/sbw/atrue/Order/Util/RegisterServlet.java deleted file mode 100644 index 0ebd121..0000000 --- a/src/app/src/main/java/com/sbw/atrue/Order/Util/RegisterServlet.java +++ /dev/null @@ -1,51 +0,0 @@ -import java.io.IOException; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import net.sf.json.JSONObject; - -public class RegisterServlet extends HttpServlet { - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - doPost(request, response); - } - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - // 设置响应内容类型 - response.setContentType("text/html;charset=utf-8"); - request.setCharacterEncoding("utf-8"); - response.setCharacterEncoding("utf-8"); - - try (PrintWriter out = response.getWriter()) { - //获得请求中传来的用户名和密码 - String account = request.getParameter("account").trim(); - String password = request.getParameter("password").trim(); - - Map params = new HashMap<>(); - JSONObject jsonObject = new JSONObject(); - if(isExist(account)){ - params.put("Result", "账号已存在"); - }else{ - UserDAO.Register(account, password); - params.put("Result", "注册成功"); - } - jsonObject.put("结果", params); - out.write(jsonObject.toString()); - } - } - //判断用户是否存在 - private Boolean isExist(String account) { - User user = UserDAO.queryUser(account); - if(user.getAccount().isEmpty()){ - return false; - }else{ - return true; - } - } -} \ No newline at end of file diff --git a/src/app/src/main/java/com/sbw/atrue/Order/Util/listen.java b/src/app/src/main/java/com/sbw/atrue/Order/Util/listen.java deleted file mode 100644 index df7903d..0000000 --- a/src/app/src/main/java/com/sbw/atrue/Order/Util/listen.java +++ /dev/null @@ -1,79 +0,0 @@ - private int socket_port=9999; - private boolean ifListen =true; - /** - * 开始监听 - */ - private Thread socketThread = new Thread() { - public void run() { - while (true) { - try { - if (serverSocket == null && ifListen) { - serverSocket = new ServerSocket(socket_port); -// serverSocket.setSoTimeout(60*1000); - } else if (serverSocket != null) { - socket = serverSocket.accept(); - if (socket != null) { - DataInputStream in = new DataInputStream(new BufferedInputStream(socket - .getInputStream())); - try { - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while ((len = in.read(buffer)) != -1) { - outStream.write(buffer, 0, len); - } - byte[] data = outStream.toByteArray(); - dataString = new String(data, "utf-8"); - AppLog.Log(dataString); - } catch (Exception e) { - AppLog.Log(AppLog.LogType.ERROR, "DataService read: " + e); - destorySocket(); - } - } - } - } catch (IOException e1) { - AppLog.Log(AppLog.LogType.ERROR, "DataService accept: " + e1); - destorySocket(); } - try { - Thread.sleep(Config.KEEP_ALIVE_RESPONSE_TIMEOUT); - } catch (InterruptedException e) { - AppLog.Log(e.toString()); - } - } - } - }; - - public void startListen() { - ifListen = true; - if (!ifSocketThreadStart) { - ifSocketThreadStart = true; - socketThread.start(); - } - } - - public void stopListen() { - ifListen = false; - destorySocket(); - } - - private void destorySocket() { - AppLog.Log("destorySocket"); - try { - if (serverSocket != null && !serverSocket.isClosed()) { - serverSocket.close(); - } - } catch (IOException e) { - AppLog.Log(e.toString()); - } finally { - serverSocket = null; - } - try { - if (socket != null && !socket.isClosed()) { - socket.close(); - } - } catch (IOException e) { - AppLog.Log(e.toString()); - } finally { - socket = null; - } - } \ No newline at end of file diff --git a/src/app/src/main/res/drawable/aaa.jpg b/src/app/src/main/res/drawable/aaa.jpg new file mode 100644 index 0000000..8e95ed8 Binary files /dev/null and b/src/app/src/main/res/drawable/aaa.jpg differ diff --git a/src/app/src/main/res/drawable/again.jpg b/src/app/src/main/res/drawable/again.jpg new file mode 100644 index 0000000..25fd361 Binary files /dev/null and b/src/app/src/main/res/drawable/again.jpg differ diff --git a/src/app/src/main/res/drawable/bbb.jpg b/src/app/src/main/res/drawable/bbb.jpg new file mode 100644 index 0000000..9fb1fe7 Binary files /dev/null and b/src/app/src/main/res/drawable/bbb.jpg differ diff --git a/src/app/src/main/res/drawable/begin.webp b/src/app/src/main/res/drawable/begin.webp new file mode 100644 index 0000000..eed8277 Binary files /dev/null and b/src/app/src/main/res/drawable/begin.webp differ diff --git a/src/app/src/main/res/drawable/bei1.webp b/src/app/src/main/res/drawable/bei1.webp new file mode 100644 index 0000000..f9bae3e Binary files /dev/null and b/src/app/src/main/res/drawable/bei1.webp differ diff --git a/src/app/src/main/res/drawable/bei2.webp b/src/app/src/main/res/drawable/bei2.webp new file mode 100644 index 0000000..b9db145 Binary files /dev/null and b/src/app/src/main/res/drawable/bei2.webp differ diff --git a/src/app/src/main/res/drawable/bei3.png b/src/app/src/main/res/drawable/bei3.png new file mode 100644 index 0000000..706b5fd Binary files /dev/null and b/src/app/src/main/res/drawable/bei3.png differ diff --git a/src/app/src/main/res/drawable/ccc.jpg b/src/app/src/main/res/drawable/ccc.jpg new file mode 100644 index 0000000..702ba78 Binary files /dev/null and b/src/app/src/main/res/drawable/ccc.jpg differ diff --git a/src/app/src/main/res/drawable/center_lucky.png b/src/app/src/main/res/drawable/center_lucky.png new file mode 100644 index 0000000..9bb0856 Binary files /dev/null and b/src/app/src/main/res/drawable/center_lucky.png differ diff --git a/src/app/src/main/res/drawable/chat.png b/src/app/src/main/res/drawable/chat.png new file mode 100644 index 0000000..84b5101 Binary files /dev/null and b/src/app/src/main/res/drawable/chat.png differ diff --git a/src/app/src/main/res/drawable/comment.png b/src/app/src/main/res/drawable/comment.png new file mode 100644 index 0000000..fb0a35a Binary files /dev/null and b/src/app/src/main/res/drawable/comment.png differ diff --git a/src/app/src/main/res/drawable/ddd.jpg b/src/app/src/main/res/drawable/ddd.jpg new file mode 100644 index 0000000..004b295 Binary files /dev/null and b/src/app/src/main/res/drawable/ddd.jpg differ diff --git a/src/app/src/main/res/drawable/hide_dowm.png b/src/app/src/main/res/drawable/hide_dowm.png new file mode 100644 index 0000000..a2861a9 Binary files /dev/null and b/src/app/src/main/res/drawable/hide_dowm.png differ diff --git a/src/app/src/main/res/drawable/nan1.webp b/src/app/src/main/res/drawable/nan1.webp new file mode 100644 index 0000000..333c4ad Binary files /dev/null and b/src/app/src/main/res/drawable/nan1.webp differ diff --git a/src/app/src/main/res/drawable/nan2.webp b/src/app/src/main/res/drawable/nan2.webp new file mode 100644 index 0000000..3fa160b Binary files /dev/null and b/src/app/src/main/res/drawable/nan2.webp differ diff --git a/src/app/src/main/res/drawable/nan3.webp b/src/app/src/main/res/drawable/nan3.webp new file mode 100644 index 0000000..7ee5c2b Binary files /dev/null and b/src/app/src/main/res/drawable/nan3.webp differ diff --git a/src/app/src/main/res/drawable/zhong.jpg b/src/app/src/main/res/drawable/zhong.jpg new file mode 100644 index 0000000..fd8c7bb Binary files /dev/null and b/src/app/src/main/res/drawable/zhong.jpg differ diff --git a/src/app/src/main/res/layout/activity_main.xml b/src/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..c9838d0 --- /dev/null +++ b/src/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + +