完成数据库相关 #5

Merged
p5gy6sexf merged 1 commits from develop_branch into master 2 years ago

@ -7,6 +7,7 @@
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-17" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

@ -47,6 +47,8 @@ android {
}
dependencies {
implementation "androidx.compose.foundation:foundation:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07"
//compose使
implementation("com.google.accompanist:accompanist-permissions:0.31.0-alpha")
//
@ -64,6 +66,7 @@ dependencies {
implementation 'androidx.core:core-ktx:+'
implementation 'androidx.core:core-ktx:+'
implementation 'androidx.core:core-ktx:+'
implementation files('libs\\jtds-1.3.1.jar')
def composeBom = platform('androidx.compose:compose-bom:2023.08.00')
implementation(composeBom)
@ -86,5 +89,4 @@ dependencies {
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

@ -1,6 +1,7 @@
package com.example.fruitandvegetableguide
import android.os.Bundle
import android.os.StrictMode
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.fillMaxSize
@ -16,6 +17,10 @@ import com.example.fruitandvegetableguide.ui.theme.FruitandVegetableGuideTheme
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
setContent {
FruitandVegetableGuideTheme() {
Surface(

@ -1,3 +1,363 @@
package com.example.fruitandvegetableguide.data.dbhelper
// TODO 这里放数据库工具方法,这些方法可以去网上找现成的
import android.util.Log
import androidx.compose.runtime.rememberCompositionContext
import com.example.fruitandvegetableguide.R
import com.example.fruitandvegetableguide.data.Guide
import com.example.fruitandvegetableguide.data.Post
import java.sql.Connection
import java.sql.DriverManager
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import kotlinx.coroutines.*
object DbHelper {
//private const val DB_URL = "jdbc:sqlserver://rm-2ze1sd060o140gu067o.sqlserver.rds.aliyuncs.com:3433;databaseName=FruitandVegetableGuide"
private const val DB_URL = "jdbc:jtds:sqlserver://rm-2ze1sd060o140gu067o.sqlserver.rds.aliyuncs.com:3433/FruitandVegetableGuide"
private const val USER = "aruan"
private const val PASS = "WRLXwrlx465434"
fun connect(): Connection? {
var conn: Connection? = null
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver")
conn = DriverManager.getConnection(DB_URL, USER, PASS)
} catch (e: SQLException) {
e.printStackTrace()
} catch (e: ClassNotFoundException) {
e.printStackTrace()
}
return conn
}
fun closeConnection(conn: Connection?) {
try {
conn?.close()
} catch (e: SQLException) {
e.printStackTrace()
}
}
fun login(username: String, password: String): Int {
val conn = connect()
var userId = -1 // 默认为 -1表示未找到用户或不匹配
if (conn != null) {
try {
val selectQuery = "SELECT id, password FROM Account WHERE username = ?"
val preparedStatement = conn.prepareStatement(selectQuery)
preparedStatement.setString(1, username) // 使用用户名作为参数
val resultSet = preparedStatement.executeQuery()
if (resultSet.next()) {
val storedPassword = resultSet.getString("password")
val userIdFromDB = resultSet.getInt("id")
// 检查提供的密码与数据库中存储的密码是否匹配
if (storedPassword == password) {
userId = userIdFromDB // 密码匹配,将用户 ID 设置为查询到的 ID
}
}
resultSet.close()
preparedStatement.close()
} catch (e: SQLException) {
e.printStackTrace()
} finally {
closeConnection(conn)
}
}
return userId
}
fun register(username: String, password: String): Boolean {
val conn = connect()
var rowsAffected = 0
if (conn != null) {
try {
val insertQuery = "INSERT INTO Account (username, password) VALUES (?, ?)"
val preparedStatement = conn.prepareStatement(insertQuery)
preparedStatement.setString(1, username)
preparedStatement.setString(2, password)
rowsAffected = preparedStatement.executeUpdate()
preparedStatement.close()
} catch (e: SQLException) {
e.printStackTrace()
} finally {
closeConnection(conn)
}
}
return rowsAffected > 0
}
//未测试
fun postListInit(): MutableList<Post> {
val conn = connect()
val posts = mutableListOf<Post>()
if (conn != null) {
try {
val postQuery = "SELECT * FROM Post LIMIT 100" // 假设post表是你的帖子表
val preparedStatement = conn.prepareStatement(postQuery)
val resultSet = preparedStatement.executeQuery()
while (resultSet.next()) {
val id = resultSet.getInt("id")
val userId = resultSet.getInt("userId")
val title = resultSet.getString("title")
val labels = resultSet.getString("labels")
val content = resultSet.getString("content")
val post = Post(id, userId, title, labels = labels, content = content)
posts.add(post)
}
preparedStatement.close()
} catch (e: SQLException) {
e.printStackTrace()
} finally {
closeConnection(conn)
}
}
println("贴子初始化成功")
return posts
}
fun getPostByPostId(postId: Int): Post {
val conn = connect()
var post = Post(0, 0, "", labels = "", content = "")
if (conn != null) {
try {
val postQuery = "select * from Post where id = ?"
val preparedStatement = conn.prepareStatement(postQuery)
preparedStatement.setInt(1, postId)
val resultSet = preparedStatement.executeQuery()
resultSet.next()
val id = resultSet.getInt("id")
val userId = resultSet.getInt("userId")
val title = resultSet.getString("title")
val labels = resultSet.getString("labels")
val content = resultSet.getString("content")
post = Post(id = id, userId = userId, title = title, labels = labels, content = content)
preparedStatement.close()
} catch (e: SQLException) {
e.printStackTrace()
} finally {
closeConnection(conn)
}
}
return post
}
fun getGuideByKind(kind: String): List<Guide> {
var guides = mutableListOf<Guide>()
var coon = connect()
if(coon != null){
try{
val guideQuery = "select * from Guide where kind = ?"
val preparedStatement = coon.prepareStatement(guideQuery)
preparedStatement.setString(1, kind)
val resultSet = preparedStatement.executeQuery()
while(resultSet.next()) {
val id = resultSet.getInt("id")
val kind = resultSet.getString("kind")
val identify = resultSet.getString("identify")
val suitable = resultSet.getString("suitable")
val taboo = resultSet.getString("taboo")
val nutritiveValue = resultSet.getString("nutritiveValue")
val recommendedMenu = resultSet.getString("recommendedMenu")
val guide = Guide(id, kind = kind, identify = identify, suitable = suitable, taboo = taboo, nutritiveValue = nutritiveValue, recommendedMenu = recommendedMenu)
guides.add(guide)
}
preparedStatement.close()
}catch(e: SQLException){
e.printStackTrace()
}finally{
closeConnection(coon)
}
}
return guides
}
fun getPostByLabels(labels: String): List<Post> {
var posts = mutableListOf<Post>()
var coon = connect()
if(coon != null){
try{
val postQuery = "select * from Post where labels LIKE ?"
val preparedStatement = coon.prepareStatement(postQuery)
val temp = "%$labels%"
preparedStatement.setString(1, temp)
val resultSet = preparedStatement.executeQuery()
while(resultSet.next()) {
val id = resultSet.getInt("id")
val userid = resultSet.getInt("userid")
val title = resultSet.getString("title")
val labels = resultSet.getString("labels")
val content = resultSet.getString("content")
val post = Post(id, userid, title, labels = labels, content = content)
posts.add(post)
}
preparedStatement.close()
}catch(e: SQLException){
//e.printStackTrace()
}finally{
closeConnection(coon)
}
}
return posts
}
fun getGuideByGuideId(guideId: Int): Guide {
val conn = connect()
var guide = Guide(0, kind = "", identify = "", suitable = "", taboo = "", nutritiveValue = "", recommendedMenu = "")
if (conn != null) {
try {
val guideQuery = "select * from Guide where id = ?"
val preparedStatement = conn.prepareStatement(guideQuery)
preparedStatement.setInt(1, guideId)
val resultSet = preparedStatement.executeQuery()
resultSet.next()
val id = resultSet.getInt("id")
val kind = resultSet.getString("kind")
val identify = resultSet.getString("identify")
val suitable = resultSet.getString("suitable")
val taboo = resultSet.getString("taboo")
val nutritiveValue = resultSet.getString("nutritiveValue")
val recommendedMenu = resultSet.getString("recommendedMenu")
guide = Guide(id=guideId, kind = kind, identify = identify, suitable = suitable, taboo = taboo, nutritiveValue = nutritiveValue, recommendedMenu = recommendedMenu)
preparedStatement.close()
} catch (e: SQLException) {
e.printStackTrace()
} finally {
closeConnection(conn)
}
}
return guide
}
//未测试
fun guideListInit(): List<Guide> {
val conn = connect()
val guides = mutableListOf<Guide>()
if (conn != null) {
try {
val guideQuery = "SELECT * FROM Guide LIMIT 100" // 假设post表是你的帖子表
val preparedStatement = conn.prepareStatement(guideQuery)
val resultSet = preparedStatement.executeQuery()
while (resultSet.next()) {
val id = resultSet.getInt("id")
val kind = resultSet.getString("kind")
val identify = resultSet.getString("identify")
val suitable = resultSet.getString("suitable")
val taboo = resultSet.getString("taboo")
val nutritiveValue = resultSet.getString("nutritiveValue")
val recommendedMenu = resultSet.getString("recommendedMenu")
val guide = Guide(id, kind = kind, identify = identify, suitable = suitable, taboo = taboo, nutritiveValue = nutritiveValue, recommendedMenu = recommendedMenu)
guides.add(guide)
}
preparedStatement.close()
} catch (e: SQLException) {
e.printStackTrace()
} finally {
closeConnection(conn)
}
}
println("guideListInit成功")
return guides
}
fun postInsert(userid: Int, title: String, imgId: Int = R.drawable.loading, labels: String, content: String) : Boolean{
val coon = connect()
var rowsAffected = 0
if(coon != null){
try{
val postInsert = "insert into Post (userId, title, imgId, labels, content) values (?, ?, ?, ?, ?)"
val preparedStatement = coon.prepareStatement(postInsert)
preparedStatement.setInt(1, userid);
preparedStatement.setString(2, title)
preparedStatement.setInt(3, imgId)
preparedStatement.setString(4, labels)
preparedStatement.setString(5, content)
rowsAffected = preparedStatement.executeUpdate()
preparedStatement.close()
}catch (e: SQLException){
e.printStackTrace()
}finally{
closeConnection(coon)
}
}
println("postInsert成功")
return rowsAffected > 0
}
fun getUsernameByUserid(userid: Int): String {
val coon = connect()
var username = ""
if(coon != null){
try{
val accountQuery = "select * from Account where id = ?"
val preparedStatement = coon.prepareStatement(accountQuery)
preparedStatement.setInt(1, userid)
val resultSet = preparedStatement.executeQuery()
resultSet.next()
username = resultSet.getString("username")
preparedStatement.close()
}catch (e:SQLException){
e.printStackTrace()
}finally {
closeConnection(coon)
}
}
println("getUsernameByUserid成功")
return username
}
fun getPostByUserid(userid: Int): List<Post> {
var posts = mutableListOf<Post>()
var coon = connect()
if(coon != null){
try{
val postQuery = "select * from Post where userID = ?"
val preparedStatement = coon.prepareStatement(postQuery)
preparedStatement.setInt(1, userid)
val resultSet = preparedStatement.executeQuery()
while(resultSet.next()) {
val id = resultSet.getInt("id")
val userid = resultSet.getInt("userid")
val title = resultSet.getString("title")
val labels = resultSet.getString("labels")
val content = resultSet.getString("content")
val post = Post(id, userid, title, labels = labels, content = content)
posts.add(post)
}
preparedStatement.close()
}catch(e: SQLException){
e.printStackTrace()
}finally{
closeConnection(coon)
}
}
return posts
}
//有问题
fun DeletePost(postToDeleteList: List<Post>): Boolean {
var coon = connect()
var rowsAffected = 0
if(coon != null){
try{
val postDelete = "delete from Post where id = ?"
val preparedStatement = coon.prepareStatement(postDelete)
for (post in postToDeleteList) {
preparedStatement.setInt(1, post.id)
val resultSet = preparedStatement.executeUpdate()
if(resultSet > 0) rowsAffected++
}
preparedStatement.close()
}catch(e: SQLException){
e.printStackTrace()
}finally{
closeConnection(coon)
}
}
if(rowsAffected == postToDeleteList.size) {
println("DeletePost成功")
return true
}
//println("DeletePost失败")
return false
}
}

@ -3,9 +3,11 @@ package com.example.fruitandvegetableguide.utils
import com.example.fruitandvegetableguide.R
import com.example.fruitandvegetableguide.data.Guide
import com.example.fruitandvegetableguide.data.Post
import com.example.fruitandvegetableguide.data.dbhelper.DbHelper
import com.example.fruitandvegetableguide.data.local.LocalAccountsDataProvider
import com.example.fruitandvegetableguide.data.local.LocalGuidesDataProvider
import com.example.fruitandvegetableguide.data.local.LocalPostsDataProvider
import kotlinx.coroutines.*
// TODO 这里放页面逻辑相关代码,要自己写,通过调用数据库工具方法实现
// 输入参数和返回参数不要改
@ -16,12 +18,13 @@ fun loginVerification(username: String, password: String): Int {
// 逻辑查询用户表用户名和密码正确返回id;用户名和密码不匹配返回-1;用户表中没有该用户名返回-1
// 输出id或-1
// 将下面的测试代码注释掉完成需要的代码之后的TODO同此
if (password == "123456") {
/* if (password == "123456") {
if (username == "aaa") return 1
if (username == "bbb") return 2
if (username == "ccc") return 3
}
return -1
return -1*/
return DbHelper.login(username, password)
}
fun register(username: String, password: String): Boolean {
@ -30,7 +33,8 @@ fun register(username: String, password: String): Boolean {
// 逻辑:插入用户表;插入成功返回true;插入失败返回false
// 输出true或false
// 将下面的测试代码注释掉,完成需要的代码
return true
// return true
return DbHelper.register(username, password)
}
fun postListInit(): List<Post> {
@ -40,7 +44,8 @@ fun postListInit(): List<Post> {
// 查询的每一行帖子数据封装成Post数据类实例即每一行数据信息都可以用来声明一个Post数据类对象然后将这些对象封装成一个列表使用mutableListOf
// 输出:列表
// 将下面的测试代码注释掉,完成需要的代码
return LocalPostsDataProvider.allPosts
// return LocalPostsDataProvider.allPosts
return DbHelper.postListInit()
}
fun getPostByPostId(postId: Int): Post {
@ -50,12 +55,13 @@ fun getPostByPostId(postId: Int): Post {
// 查询的数据信息封装成一个Post数据类对象
// 输出Post对象
// 将下面的测试代码注释掉,完成需要的代码
for (post in LocalPostsDataProvider.allPosts) {
if (post.id == postId) {
return post
}
}
return LocalPostsDataProvider.allPosts[0]
// for (post in LocalPostsDataProvider.allPosts) {
// if (post.id == postId) {
// return post
// }
// }
// return LocalPostsDataProvider.allPosts[0]
return DbHelper.getPostByPostId(postId)
}
fun getGuideByKind(kind: String): List<Guide> {
@ -68,13 +74,14 @@ fun getGuideByKind(kind: String): List<Guide> {
if (kind == "") {
return guideListInit()
}
var guides = mutableListOf<Guide>()
for (guide in LocalGuidesDataProvider.allGuides) {
if (kind in guide.kind) {
guides.add(guide)
}
}
return guides
// var guides = mutableListOf<Guide>()
// for (guide in LocalGuidesDataProvider.allGuides) {
// if (kind in guide.kind) {
// guides.add(guide)
// }
// }
// return guides
return DbHelper.getGuideByKind(kind)
}
fun getPostByLabels(labels: String): List<Post> {
@ -87,13 +94,14 @@ fun getPostByLabels(labels: String): List<Post> {
if (labels == "") {
return postListInit()
}
var posts = mutableListOf<Post>()
for (post in LocalPostsDataProvider.allPosts) {
if (labels in post.labels) {
posts.add(post)
}
}
return posts
// var posts = mutableListOf<Post>()
// for (post in LocalPostsDataProvider.allPosts) {
// if (labels in post.labels) {
// posts.add(post)
// }
// }
// return posts
return DbHelper.getPostByLabels(labels)
}
@ -104,12 +112,13 @@ fun getGuideByGuideId(guideId: Int): Guide {
// 查询的数据信息封装成一个Guide数据类对象
// 输出Guide对象
// 将下面的测试代码注释掉,完成需要的代码
for (guide in LocalGuidesDataProvider.allGuides) {
if (guide.id == guideId) {
return guide
}
}
return LocalGuidesDataProvider.allGuides[0]
// for (guide in LocalGuidesDataProvider.allGuides) {
// if (guide.id == guideId) {
// return guide
// }
// }
// return LocalGuidesDataProvider.allGuides[0]
return DbHelper.getGuideByGuideId(guideId)
}
fun guideListInit(): List<Guide> {
@ -119,7 +128,7 @@ fun guideListInit(): List<Guide> {
// 查询的每一行指南数据封装成Guide数据类实例即每一行数据信息都可以用来声明一个Guide数据类对象然后将这些对象封装成一个列表使用mutableListOf
// 输出:列表
// 将下面的测试代码注释掉,完成需要的代码
return LocalGuidesDataProvider.allGuides
return DbHelper.guideListInit()
}
fun postInsert(
@ -138,14 +147,15 @@ fun postInsert(
// 逻辑将传入的内容插入到post表。插入成功返回true否则返回false
// 输出true或false
// 将下面的测试代码注释掉,完成需要的代码
val newPost =
Post(LocalPostsDataProvider.allPosts.size + 1, userid, title, imgId, labels, content)
try {
LocalPostsDataProvider.allPosts.add(newPost)
} catch (e: RuntimeException) {
return false
}
return true
// val newPost =
// Post(LocalPostsDataProvider.allPosts.size + 1, userid, title, imgId, labels, content)
// try {
// LocalPostsDataProvider.allPosts.add(newPost)
// } catch (e: RuntimeException) {
// return false
// }
// return true
return DbHelper.postInsert(userid, title, imgId ,labels, content)
}
fun getUsernameByUserid(userid: Int): String {
@ -154,12 +164,13 @@ fun getUsernameByUserid(userid: Int): String {
// 逻辑查询账户表条件id==userid。
// 输出username
// 将下面的测试代码注释掉,完成需要的代码
for (user in LocalAccountsDataProvider.allUserAccounts) {
if (user.id == userid) {
return user.username
}
}
return LocalAccountsDataProvider.allUserAccounts[0].username
// for (user in LocalAccountsDataProvider.allUserAccounts) {
// if (user.id == userid) {
// return user.username
// }
// }
// return LocalAccountsDataProvider.allUserAccounts[0].username
return DbHelper.getUsernameByUserid(userid)
}
fun getPostByUserid(userid: Int): List<Post> {
@ -169,13 +180,14 @@ fun getPostByUserid(userid: Int): List<Post> {
// 查询的每一行数据信息封装成一个Post数据类对象
// 输出Post的列表
// 将下面的测试代码注释掉,完成需要的代码
var postList = mutableListOf<Post>()
for (post in LocalPostsDataProvider.allPosts) {
if (post.userId == userid) {
postList.add(post)
}
}
return postList
// var postList = mutableListOf<Post>()
// for (post in LocalPostsDataProvider.allPosts) {
// if (post.userId == userid) {
// postList.add(post)
// }
// }
// return postList
return DbHelper.getPostByUserid(userid)
}
fun DeletePost(postToDeleteList: List<Post>): Boolean {
@ -185,12 +197,13 @@ fun DeletePost(postToDeleteList: List<Post>): Boolean {
// 删除成功返回true否则返回false
// 输出true或false
// 将下面的测试代码注释掉,完成需要的代码
try {
for (post in postToDeleteList) {
LocalPostsDataProvider.allPosts.remove(post)
}
} catch (e: RuntimeException) {
return false
}
return true
// try {
// for (post in postToDeleteList) {
// LocalPostsDataProvider.allPosts.remove(post)
// }
// } catch (e: RuntimeException) {
// return false
// }
// return true
return DbHelper.DeletePost(postToDeleteList)
}
Loading…
Cancel
Save