diff --git a/README.md b/README.md new file mode 100644 index 0000000..763a411 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +## 如何运行本项目? + +### 法一(推荐): + +### 法二 + +1. 下载2022版本的android studio(老旧版本可能出现bug) + +![屏幕截图 2024-05-22 163356](D:\folder\study\JianShu\mdfile_pic\屏幕截图 2024-05-22 163356.png) + +2. android studio内置各种安卓模拟机,需要首先打开Device Manager下载,建议下载Pixel 5 API30,下载模拟机可能耗时几分钟 + ![50e125560f05d7d05efbd30ab3059d3](D:\folder\study\JianShu\mdfile_pic\50e125560f05d7d05efbd30ab3059d3.png) + ![屏幕截图 2024-05-22 164310](D:\folder\study\JianShu\mdfile_pic\屏幕截图 2024-05-22 164310.png) + ![屏幕截图 2024-05-22 164348](D:\folder\study\JianShu\mdfile_pic\屏幕截图 2024-05-22 164348.png) +3. 导入本项目,点击根目录JianShu + ![屏幕截图 2024-05-22 164628](D:\folder\study\JianShu\mdfile_pic\屏幕截图 2024-05-22 164628.png) +4. Gradle会自动导入依赖,下载本项目所依赖的文件,若android studio右下角停止加载则说明项目导入成功,第一次加载时间可能比较长 + ![image-20240522164840554](C:\Users\zhangsan\AppData\Roaming\Typora\typora-user-images\image-20240522164840554.png) + 如果意外中断了,可以在Android Studio中,点击`File > Sync Project with Gradle Files`。 + +5. 运行项目,第一次运行会在模拟机上安卓该app + + ![a5d83c0db4d39a9222c9fe7af580e1e](D:\folder\study\JianShu\mdfile_pic\a5d83c0db4d39a9222c9fe7af580e1e.png) + +6. 出现登录界面则成功 + image-20240522165431074 \ No newline at end of file diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..a881bec Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..7abf561 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "edu.whut.jianshu", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/java/edu/whut/jianshu/Activity/MyActivity.kt b/app/src/main/java/edu/whut/jianshu/Activity/MyActivity.kt index 510ae67..8929ab7 100644 --- a/app/src/main/java/edu/whut/jianshu/Activity/MyActivity.kt +++ b/app/src/main/java/edu/whut/jianshu/Activity/MyActivity.kt @@ -37,7 +37,7 @@ class MyActivity : AppCompatActivity() { tUserName.text=p.nickName tUserSignature.text=p.signature Glide.with(this@MyActivity) // 传入 Context - .load(p.face.url) // 加载图片的 URL + .load(p.face?.url ?: "https://bmob-cdn-31452.bmobpay.com/2024/04/30/6f0e4b19405153ed80f2f1bdfa10da0b.png") // 加载图片的 URL,如果 face 为 null 使用默认 URL .placeholder(R.drawable.pre_load) // 设置占位图 .error(R.drawable.fail_load) // 设置加载失败时显示的图片 .into(iv_avatar) // 将图片加载到指定的 ImageView 中 diff --git a/app/src/main/java/edu/whut/jianshu/Activity/RegisterActivity.kt b/app/src/main/java/edu/whut/jianshu/Activity/RegisterActivity.kt index c454228..c1bd214 100644 --- a/app/src/main/java/edu/whut/jianshu/Activity/RegisterActivity.kt +++ b/app/src/main/java/edu/whut/jianshu/Activity/RegisterActivity.kt @@ -7,6 +7,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import cn.bmob.v3.Bmob import cn.bmob.v3.BmobQuery +import cn.bmob.v3.datatype.BmobFile import cn.bmob.v3.exception.BmobException import cn.bmob.v3.listener.FindListener import cn.bmob.v3.listener.SaveListener @@ -18,100 +19,112 @@ class RegisterActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_register) - inits() + Bmob.initialize(this, "8f9f1d1ea520b0ce4f84a6fa83a5f754") + initViews() } - private fun inits() { - image_backtoLogin.setOnClickListener{ - val intent=Intent(this,LoginActivity::class.java) - startActivity(intent) + private fun initViews() { + image_backtoLogin.setOnClickListener { + startActivity(Intent(this, LoginActivity::class.java)) finish() } + button_check.setOnClickListener { - var flag: Boolean = false - val use_account: String = et_reg_account.text.toString() - Log.d("zhangyu", use_account) - val bmobQuery = BmobQuery() -// bmobQuery.addWhereEqualTo("account", use_account) - bmobQuery.findObjects(object : FindListener() { - override fun done(list: List, e: BmobException?) { - if (e == null) { - for (i in list) { - if (use_account.equals(i.account)) { - Toast.makeText(this@RegisterActivity, "账号已注册!", Toast.LENGTH_SHORT) - .show() - flag=true - } - } - if(flag!=true) - Toast.makeText(this@RegisterActivity,"可以注册",Toast.LENGTH_SHORT).show() - } - } - }) + checkAccountAvailability() } + bt_reg_register.setOnClickListener { - var sex: String = "" - if (rg_reg_man.isChecked) - sex = "男" - else if (rg_reg_woman.isChecked) - sex = "女" - else - sex = "未知" - val user = User_bmob() - val use_account: String = et_reg_account.text.toString() - val use_pwd: String = et_reg_pwd.text.toString() - val use_agapwd: String = et_reg_agapwd.text.toString() - val use_name: String = et_reg_name.text.toString() - val use_mail: String = et_reg_email.text.toString() - val use_phone: String = et_reg_phone.text.toString() - val bmobQuery = BmobQuery() - bmobQuery.findObjects(object : FindListener() { - override fun done(list: List, e: BmobException?) { - if (e == null) { - for (i in list) { - if (use_account.equals(i.account)) { - Toast.makeText(this@RegisterActivity, "账号已注册!", Toast.LENGTH_SHORT) - .show() - } - } - } - } - }) - if (use_account.isEmpty() || use_pwd.isEmpty() || use_agapwd.isEmpty()) - Toast.makeText(this, "账号或密码不能为空白!", Toast.LENGTH_SHORT).show() - if (use_mail.isEmpty()) - Toast.makeText(this, "邮箱不能为空白!", Toast.LENGTH_SHORT).show() - else if (use_agapwd != use_pwd) { - Toast.makeText(this, "两次密码输入不一致!", Toast.LENGTH_SHORT).show() - } - else { - user.setaccount(use_account) - user.setpassword(use_pwd) - user.setemail(use_mail) - user.setnickName(use_name) - user.setphone(use_phone) - user.setsex(sex) - user.save(object : SaveListener() { - override fun done(objectId: String?, e: BmobException?) { - if (e == null) { - Toast.makeText( - this@RegisterActivity, - objectId + "注册成功!", - Toast.LENGTH_SHORT - ).show() - } else { - Toast.makeText( - this@RegisterActivity, - "注册失败!" + e.message, - Toast.LENGTH_SHORT - ).show() - } - } - }) - val intent = Intent(this, LoginActivity::class.java) - startActivity(intent) - finish() - } + registerUser() } } -} \ No newline at end of file + + private fun checkAccountAvailability() { + val account = et_reg_account.text.toString().trim() + if (account.isEmpty()) { + Toast.makeText(this, "账号不能为空", Toast.LENGTH_SHORT).show() + return + } + + val query = BmobQuery() + query.addWhereEqualTo("account", account) + query.findObjects(object : FindListener() { + override fun done(users: List, e: BmobException?) { + if (e == null) { + if (users.isNotEmpty()) { + Toast.makeText(this@RegisterActivity, "账号已注册!", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this@RegisterActivity, "可以注册", Toast.LENGTH_SHORT).show() + } + } else { + Toast.makeText(this@RegisterActivity, "检查失败: ${e.message}", Toast.LENGTH_SHORT).show() + } + } + }) + } + + private fun registerUser() { + val account = et_reg_account.text.toString().trim() + val password = et_reg_pwd.text.toString().trim() + val confirmPassword = et_reg_agapwd.text.toString().trim() + val email = et_reg_email.text.toString().trim() + val name = et_reg_name.text.toString().trim() + val phone = et_reg_phone.text.toString().trim() + val sex = when { + rg_reg_man.isChecked -> "男" + rg_reg_woman.isChecked -> "女" + else -> "未知" + } + + if (account.isEmpty() || password.isEmpty() || confirmPassword.isEmpty()) { + Toast.makeText(this, "账号或密码不能为空白!", Toast.LENGTH_SHORT).show() + return + } + if (email.isEmpty()) { + Toast.makeText(this, "邮箱不能为空白!", Toast.LENGTH_SHORT).show() + return + } + if (password != confirmPassword) { + Toast.makeText(this, "两次密码输入不一致!", Toast.LENGTH_SHORT).show() + return + } + + val query = BmobQuery() + query.addWhereEqualTo("account", account) + query.findObjects(object : FindListener() { + override fun done(users: List, e: BmobException?) { + if (e == null) { + if (users.isNotEmpty()) { + Toast.makeText(this@RegisterActivity, "账号已注册!", Toast.LENGTH_SHORT).show() + } else { + saveUser(account, password, email, name, phone, sex) + } + } else { + Toast.makeText(this@RegisterActivity, "检查失败: ${e.message}", Toast.LENGTH_SHORT).show() + } + } + }) + } + + private fun saveUser(account: String, password: String, email: String, name: String, phone: String, sex: String) { + val user = User_bmob().apply { + setaccount(account) + setpassword(password) + setemail(email) + setnickName(name) + setphone(phone) + setsex(sex) + } + + user.save(object : SaveListener() { + override fun done(objectId: String?, e: BmobException?) { + if (e == null) { + Toast.makeText(this@RegisterActivity, "注册成功!", Toast.LENGTH_SHORT).show() + startActivity(Intent(this@RegisterActivity, LoginActivity::class.java)) + finish() + } else { + Toast.makeText(this@RegisterActivity, "注册失败: ${e.message}", Toast.LENGTH_SHORT).show() + } + } + }) + } +} diff --git a/app/src/main/java/edu/whut/jianshu/Activity/sendPerceptionActivity.kt b/app/src/main/java/edu/whut/jianshu/Activity/sendPerceptionActivity.kt index fbc168a..f97c676 100644 --- a/app/src/main/java/edu/whut/jianshu/Activity/sendPerceptionActivity.kt +++ b/app/src/main/java/edu/whut/jianshu/Activity/sendPerceptionActivity.kt @@ -107,7 +107,7 @@ class sendPerceptionActivity:AppCompatActivity() { if (e == null) { user?.let { Glide.with(this@sendPerceptionActivity) // 传入 Context - .load(it.face.url) // 加载图片的 URL + .load(it.face?.url ?: "https://bmob-cdn-31452.bmobpay.com/2024/04/30/6f0e4b19405153ed80f2f1bdfa10da0b.png") // 加载图片的 URL .placeholder(R.drawable.pre_load) // 设置占位图 .error(R.drawable.fail_load) // 设置加载失败时显示的图片 .into(send_avatar) // 将图片加载到指定的 ImageView 中 diff --git a/app/src/main/java/edu/whut/jianshu/Adapter/MarkingAdapter.kt b/app/src/main/java/edu/whut/jianshu/Adapter/MarkingAdapter.kt index 11bd00e..bc1cf7e 100644 --- a/app/src/main/java/edu/whut/jianshu/Adapter/MarkingAdapter.kt +++ b/app/src/main/java/edu/whut/jianshu/Adapter/MarkingAdapter.kt @@ -60,7 +60,7 @@ class MarkingAdapter(val markingList: List) : val userData = userList.first() holder.user_name.text = userData.nickName Glide.with(holder.itemView.context) - .load(userData.face.url) + .load(userData.face?.url ?: "https://bmob-cdn-31452.bmobpay.com/2024/04/30/6f0e4b19405153ed80f2f1bdfa10da0b.png") .placeholder(R.drawable.pre_load) .error(R.drawable.fail_load) .into(holder.user_Image) diff --git a/app/src/main/java/edu/whut/jianshu/Adapter/PerceptionAdapter.kt b/app/src/main/java/edu/whut/jianshu/Adapter/PerceptionAdapter.kt index 6885e4d..ce0e079 100644 --- a/app/src/main/java/edu/whut/jianshu/Adapter/PerceptionAdapter.kt +++ b/app/src/main/java/edu/whut/jianshu/Adapter/PerceptionAdapter.kt @@ -68,7 +68,7 @@ class PerceptionAdapter(val perceptionList: List) : val userData = userList.first() holder.perception_username.text = userData.nickName Glide.with(holder.itemView.context) - .load(userData.face.url) + .load(userData.face?.url ?: "https://bmob-cdn-31452.bmobpay.com/2024/04/30/6f0e4b19405153ed80f2f1bdfa10da0b.png") .placeholder(R.drawable.pre_load) .error(R.drawable.fail_load) .into(holder.perception_userIcon) diff --git a/app/src/main/java/edu/whut/jianshu/Data/entity/User_bmob.kt b/app/src/main/java/edu/whut/jianshu/Data/entity/User_bmob.kt index 173771f..fd60327 100644 --- a/app/src/main/java/edu/whut/jianshu/Data/entity/User_bmob.kt +++ b/app/src/main/java/edu/whut/jianshu/Data/entity/User_bmob.kt @@ -3,63 +3,86 @@ package edu.whut.jianshu.Data.entity import cn.bmob.v3.BmobObject import cn.bmob.v3.datatype.BmobFile -class User_bmob:BmobObject(){ - var account:String="" - var signature:String="" - var nickName:String="" - var password:String="" - var email:String="" - var sex:String="" - var phone:String="" - var address:String="" - var face:BmobFile=BmobFile() - fun setaccount(account:String){ - this.account=account +class User_bmob : BmobObject() { + var account: String = "" + var signature: String = "" + var nickName: String = "" + var password: String = "" + var email: String = "" + var sex: String = "" + var phone: String = "" + var address: String = "" + var face: BmobFile? = null + + fun setaccount(account: String) { + this.account = account } - fun getaccount():String{ + + fun getaccount(): String { return this.account } - fun setsignature(signature:String){ - this.signature=signature + + fun setsignature(signature: String) { + this.signature = signature } - fun getsignature():String{ + + fun getsignature(): String { return this.signature } - fun setnickName(nickName:String){ - this.nickName=nickName + + fun setnickName(nickName: String) { + this.nickName = nickName } - fun getnickName():String{ + + fun getnickName(): String { return this.nickName } - fun setpassword(password:String){ - this.password=password + + fun setpassword(password: String) { + this.password = password } - fun getpassword():String{ + + fun getpassword(): String { return this.password } - fun setemail(email:String){ - this.email=email + + fun setemail(email: String) { + this.email = email } - fun getemail():String{ + + fun getemail(): String { return this.email } - fun setsex(sex:String){ - this.sex=sex + + fun setsex(sex: String) { + this.sex = sex } - fun getsex():String{ + + fun getsex(): String { return this.sex } - fun setphone(phone:String){ - this.phone=phone + + fun setphone(phone: String) { + this.phone = phone } - fun getphone():String{ + + fun getphone(): String { return this.phone } - fun setaddress(address:String){ - this.address=address + + fun setaddress(address: String) { + this.address = address } - fun getaddress():String{ + + fun getaddress(): String { return this.address } -} \ No newline at end of file + fun setface(face: BmobFile) { + this.face = face + } + + fun getface(): BmobFile? { + return this.face + } +} diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml index 1b56fd1..45b180f 100644 --- a/app/src/main/res/layout/activity_register.xml +++ b/app/src/main/res/layout/activity_register.xml @@ -1,11 +1,7 @@ - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" @@ -71,19 +68,20 @@ + android:src="@drawable/nickname" /> @@ -112,13 +110,13 @@ @@ -126,6 +124,7 @@ android:id="@+id/et_reg_pwd" android:layout_width="match_parent" android:layout_height="35dp" + android:layout_marginLeft="@dimen/s_dp_5" android:background="@drawable/edit_bg" android:hint="输入你的密码" android:inputType="textPassword" /> @@ -133,12 +132,12 @@ @@ -147,44 +146,47 @@ android:layout_width="match_parent" android:layout_height="35dp" android:layout_marginTop="10dp" + android:layout_marginLeft="@dimen/s_dp_5" android:background="@drawable/edit_bg" android:hint="再次输入你的密码" android:inputType="textPassword" /> @@ -195,6 +197,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" android:layout_marginTop="20dp" android:background="@drawable/edit_bg" android:text="提交" /> diff --git a/mdfile_pic/50e125560f05d7d05efbd30ab3059d3.png b/mdfile_pic/50e125560f05d7d05efbd30ab3059d3.png new file mode 100644 index 0000000..213adf4 Binary files /dev/null and b/mdfile_pic/50e125560f05d7d05efbd30ab3059d3.png differ diff --git a/mdfile_pic/a5d83c0db4d39a9222c9fe7af580e1e.png b/mdfile_pic/a5d83c0db4d39a9222c9fe7af580e1e.png new file mode 100644 index 0000000..aebda4d Binary files /dev/null and b/mdfile_pic/a5d83c0db4d39a9222c9fe7af580e1e.png differ diff --git a/mdfile_pic/屏幕截图 2024-05-22 163356.png b/mdfile_pic/屏幕截图 2024-05-22 163356.png new file mode 100644 index 0000000..b32c25f Binary files /dev/null and b/mdfile_pic/屏幕截图 2024-05-22 163356.png differ diff --git a/mdfile_pic/屏幕截图 2024-05-22 164310.png b/mdfile_pic/屏幕截图 2024-05-22 164310.png new file mode 100644 index 0000000..39e1925 Binary files /dev/null and b/mdfile_pic/屏幕截图 2024-05-22 164310.png differ diff --git a/mdfile_pic/屏幕截图 2024-05-22 164348.png b/mdfile_pic/屏幕截图 2024-05-22 164348.png new file mode 100644 index 0000000..af07ff3 Binary files /dev/null and b/mdfile_pic/屏幕截图 2024-05-22 164348.png differ diff --git a/mdfile_pic/屏幕截图 2024-05-22 164628.png b/mdfile_pic/屏幕截图 2024-05-22 164628.png new file mode 100644 index 0000000..bd7de55 Binary files /dev/null and b/mdfile_pic/屏幕截图 2024-05-22 164628.png differ diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 6cb59a3..0000000 --- a/readme.txt +++ /dev/null @@ -1 +0,0 @@ -安卓项目是面向用户的,目前数据库设计有点问题,应该“管理员”专门设置一个热门图书表和好评图书表,而不要用户自己来查图片 \ No newline at end of file