当前位置: 首页 > news >正文

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题:

01.C语言从不挂科到高绩点

https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482icon-default.png?t=O83Ahttps://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482

02. SpringBoot详细教程

https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482icon-default.png?t=O83Ahttps://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.548203.SpringBoot电脑商城项目

https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482icon-default.png?t=O83Ahttps://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.548204.VUE3.0 核心教程

https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482icon-default.png?t=O83Ahttps://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482

================================

||   持续分享系列教程,关注一下不迷路  ||

||   视频教程:小破站:墨轩大楼             ||

================================

🌳 查询音乐列表功能

🌾 后端查询列表功能

🍄 数据库sql语句
/*
Navicat MySQL Data TransferSource Server         : hui
Source Server Version : 50525
Source Host           : localhost:3306
Source Database       : musicTarget Server Type    : MYSQL
Target Server Version : 50525
File Encoding         : 65001Date: 2023-09-07 00:34:12
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for `music`
-- ----------------------------
DROP TABLE IF EXISTS `music`;
CREATE TABLE `music` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`pic` varchar(255) DEFAULT NULL,`author` varchar(255) DEFAULT NULL,`location` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of music
-- ----------------------------
INSERT INTO `music` VALUES ('1', '听说爱情回来过', null, '蔡依林', 'music/听说爱情回来过 - 蔡依林.mp3');
INSERT INTO `music` VALUES ('2', '天外来物', null, '薛之谦', 'music/天外来物 - 薛之谦.mp3');
INSERT INTO `music` VALUES ('3', '药水歌', null, '药水哥', 'music/药水歌 - 药水哥.mp3');
🍄 添加数据库驱动依赖

访问Mysql数据库,需要用到Mysql的驱动,我们在Pom.xml中添加数据库的依赖,代码如下:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>
</dependency>
🍄 数据库操作工具类

在项目的util包中添加DBUtil类,该类用来访问mysql数据,具体代码如下:

package com.softeem.webService.util;import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;/*** 操作数据库的工具类  -》  Mybatis 的原理*/
public class DBUtils {private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";/** url��ַ  192.168.32.125 **/private static final String URL = "jdbc:mysql://127.0.0.1:3306/music?useUnicode=true&characterEncoding=utf8";private static final String USER = "root";private static final String PASSWORD = "123456";static {try {Class.forName(DRIVER_CLASS);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 链接数据库的方法*/public static Connection getConn() {try {return DriverManager.getConnection(URL, USER, PASSWORD);} catch (SQLException e) {e.printStackTrace();}return null;}/*** 数据库更新的工具方法* @param sql   需要执行的sql语句* @param params  执行sql语句需要的参数* @return* @throws SQLException*/public static boolean exeUpdate(String sql,Object ...params) throws SQLException {//获取数据库链接Connection conn = getConn();//预编译sql语句PreparedStatement ps = conn.prepareStatement(sql);//配置sql语句中的问号for(int i = 0;i<params.length;i++) {ps.setObject(i+1, params[i]);}//执行sql语句int i = ps.executeUpdate();//关闭数据库链接ps.close();conn.close();//返回执行结果return i > 0 ? true : false;}/*** 查询多条数据的工具方法* @param t* @param sql* @param params* @param <T>* @return*/public static <T> List<T> queryList(Class<T> t, String sql, Object... params) {List<T> list = new ArrayList<>();T obj = null;Connection conn = null;PreparedStatement ps = null;try {conn = getConn();ps = conn.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}ResultSet rs = ps.executeQuery();ResultSetMetaData rsmd = rs.getMetaData();Map<String, Object> map = new HashMap<>();while (rs.next()) {map.clear();for (int i = 0; i < rsmd.getColumnCount(); i++) {String cname = rsmd.getColumnLabel(i + 1);Object value = rs.getObject(cname);map.put(cname, value);}if (!map.isEmpty()) {Set<String> columnNames = map.keySet();obj = t.newInstance();for (String column : columnNames) {Object value = map.get(column);if(Objects.nonNull(value)){	Field f = t.getDeclaredField(column);f.setAccessible(true);f.set(obj, value);}}list.add(obj);}}} catch (SQLException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}return list;}/*** 查询单条数据的工具方法* @param t* @param sql* @param params* @param <T>* @return*/public static <T> T queryOne(Class<T> t, String sql, Object... params) {T obj = null;Connection conn = null;PreparedStatement ps = null;try {conn = getConn();ps = conn.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}ResultSet rs = ps.executeQuery();ResultSetMetaData rsmd = rs.getMetaData();if (rs.next()) {obj = t.newInstance();for (int i = 0; i < rsmd.getColumnCount(); i++) {String cname = rsmd.getColumnLabel(i + 1);Object value = rs.getObject(cname);if(Objects.nonNull(value)){						Field field = t.getDeclaredField(cname);field.setAccessible(true);field.set(obj, value);}}}} catch (SQLException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}return obj;}}
🍄添加实体类

在项目中添加Music类,其中的属性与数据库中的music表字段对应,用来暂存从数据库中查询出来的音乐数据。具体代码如下:

package com.softeem.webService.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Music {private int id;private String name;private String pic;private String author;private String location ;
}
🍄 编写查询音乐列表的接口

在Controller包中添加MusicListController并绑定music_list请求,当发送music_list请求时,访问service方法,去查询出所有的音乐列表,返回给客户端,具体代码如下:

package com.softeem.webService.controller;import com.alibaba.fastjson2.JSONObject;
import com.softeem.webService.service.MusicService;
import com.softeem.webService.util.Result;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/music_list")
public class MusicListController extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置请求编码req.setCharacterEncoding("utf-8");// 设置响应编码resp.setContentType("text/html;charset=utf-8");// 创建业务端MusicService service = new MusicService();// 调用服务端获取所有的音乐Result result = service.getAllMusics();// 将音乐列表转换成json对象JSONObject jsonObject = JSONObject.from(result);// 将结果返回给客户端PrintWriter out = resp.getWriter();out.println(jsonObject);}
}
🍄 编写业务端,查询音乐列表

在项目中新建一个MusicService类,用来作为业务端口,负责处理有关于音乐的业务,具体代码如下:

package com.softeem.webService.service;import com.softeem.webService.dao.MusicDao;
import com.softeem.webService.entity.Music;
import com.softeem.webService.util.Result;import java.util.List;public class MusicService {/*** 获取所有的音乐* @return*/public Result getAllMusics() {// 创建DaoMusicDao dao = new MusicDao();// 操作数据库,查询所有的音乐列表List<Music> musicList = dao.findAllMusics();// 将查询出来的音乐列表进行封装return Result.success(musicList);}
}
🍄 操作数据库,查询音乐

在项目中新建一个MusicDao类,该类负责操作数据库中的music表,目前我们先暂时只添加一个查询所有音乐的方法,具体代码如下:

package com.softeem.webService.dao;import com.softeem.webService.entity.Music;
import com.softeem.webService.util.DBUtils;import java.util.List;public class MusicDao {public List<Music> findAllMusics() {String sql = "select * from music";return DBUtils.queryList(Music.class,sql);}
}
🍄测试

编写完毕之后,启动服务器,在浏览器中输入以下地址:

http://localhost:8080/music_list

显示结果如下:

🌾 前端Android程序

🍄 编写列表布局界面

在layout文件夹中新建music_list.xml,添加ListView代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="#000000">
<ListViewandroid:id="@+id/music_list"android:layout_width="match_parent"android:layout_height="match_parent"android:divider="@drawable/category_item_bg77"android:gravity="center"/>
</LinearLayout>
🍄 编写列表选项布局界面

在layout文件夹中新建music_item.xml布局文件,为列表中的每一个选项进行布局,具体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"><TextViewandroid:id="@+id/num"android:layout_width="100px"android:layout_height="50dp"android:textSize="30px"android:gravity="center_vertical"android:textColor="#FFFFFF"android:singleLine="true"/><TextViewandroid:id="@+id/music_name"android:layout_width="194dp"android:layout_height="50dp"android:layout_marginLeft="30px"android:text="过火"android:textSize="30px"android:gravity="center_vertical"android:textColor="#FFFFFF"android:singleLine="true"></TextView><TextViewandroid:id="@+id/music_author"android:layout_width="138dp"android:layout_height="50dp"android:layout_marginLeft="50px"android:text="张信哲"android:textSize="30px"android:gravity="center_vertical"android:textColor="#FFFFFF"android:singleLine="true"></TextView><TextViewandroid:id="@+id/music_id"android:layout_width="100px"android:layout_height="50dp"android:textSize="30px"android:gravity="center_vertical"android:textColor="#FFFFFF"android:singleLine="true"/>
</LinearLayout>
🍄Music实体类:
package com.moxuan.mytest;public class Music {private int id;private String name;private String pic;private String author;private String location ;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}
}
🍄 编写列表适配器

新建MusicListAdapter类,用来适配查询出来的音乐数据和列表布局界面,具体代码如下:

package com.moxuan.mytest;import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import androidx.recyclerview.widget.RecyclerView;import java.util.List;public class MusicListAdapter extends BaseAdapter {// 音乐列表数据源private List mData;// 声明布局服务private LayoutInflater mLayoutInflater;/*** 构造方法,创建适配器* @param context* @param data*/public MusicListAdapter(Context context, List data){mData = data;mLayoutInflater = LayoutInflater.from(context);}/*** 获取列表的总条目数* @return*/@Overridepublic int getCount() {return mData.size();}/*** 获取列表中指定位置上的条目* @param position* @return*/@Overridepublic Object getItem(int position) {return mData.get(position);}/*** 获取条目在列表中的位置* @param position* @return*/@Overridepublic long getItemId(int position) {return position;}/*** 适配数据到布局文件中* @param position 位置* @param convertView 选项布局视图* @param parent* @return*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {// 获取布局文件convertView = mLayoutInflater.inflate(R.layout.music_item, parent, false);viewHolder = new ViewHolder();//获取显示歌曲名称的视图viewHolder.nameView = convertView.findViewById(R.id.music_name);// 获取歌手的视图viewHolder.authorView = convertView.findViewById(R.id.music_author);// 获取歌曲编号的视图viewHolder.numView = convertView.findViewById(R.id.num);viewHolder.idView = convertView.findViewById(R.id.music_id);// 将视图设置到布局中convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}// 将音乐数据,适配到对应的视图中Music music = (Music) mData.get(position);viewHolder.nameView.setText(music.getName());viewHolder.authorView.setText(music.getAuthor());viewHolder.numView.setText((position+1)+".");// 传入id,方便后续根据id查找歌曲Log.i("info",music.getId()+"");viewHolder.idView.setText(music.getId()+"");// 将id隐藏起来viewHolder.idView.setVisibility(View.GONE);return convertView;}/*** 自定义子选项布局视图* 对应music_item.xml中的组件*/static class ViewHolder {TextView numView;TextView nameView;TextView authorView;TextView idView;}
}

🍄 编写MusicListActivity

编写MusicListActivity发送请求,向服务器获取音乐列表,并通过适配器,显示出来,具体代码如下:

package com.moxuan.mytest;import android.app.Activity;
import android.app.DownloadManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;import androidx.annotation.Nullable;import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.util.ArrayList;
import java.util.List;import cz.msebera.android.httpclient.Header;public class MusicListActivity extends Activity {// 显示音乐列表的列表视图ListView musicListView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载布局文件setContentView(R.layout.music_list);// 获取列表视图musicListView = findViewById(R.id.music_list);// 封装请求参数RequestParams requestParams = new RequestParams();// 发送异步请求 想服务端请求音乐列表数据// 注意:192.168.5.107 为我电脑上的IP,大家写的时候需要换成自己服务器端ip地址new AsyncHttpClient().post("http://192.168.5.107:8080/music_list", requestParams, new AsyncHttpResponseHandler() {/*** 当服务器成功响应时会执行的方法* @param status  服务器当前的状态, 值为200时,代表着服务成功处理请求,并返回了数据* @param headers* @param responseBody 服务器返回的数据*/@Overridepublic void onSuccess(int status, Header[] headers, byte[] responseBody) {// 如果服务器成功返回数据if(status==200){// 将返回的数据转换成json对象try {JSONObject jsonObject = new JSONObject(new String(responseBody));// 获取json数组,数组中存放的是音乐数据JSONArray musics_array = jsonObject.getJSONArray("data");List<Music> musicList = new ArrayList<>();// 遍历音乐数据,将音乐数据封装到音乐列表中for(int i=0;i<musics_array.length();i++){Music music = new Music();JSONObject jo = musics_array.getJSONObject(i);music.setId(jo.getInt("id"));music.setAuthor(jo.getString("author"));music.setLocation(jo.getString("location"));music.setName(jo.getString("name"));musicList.add(music);}// 创建音乐列表适配器,将查询出来的音乐列表显示出来MusicListAdapter adapter = new MusicListAdapter(MusicListActivity.this,musicList);musicListView.setAdapter(adapter);} catch (JSONException e) {e.printStackTrace();}}}/*** 如果服务器响应失败会执行的方法* @param i* @param headers* @param bytes* @param throwable*/@Overridepublic void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {Toast.makeText(MusicListActivity.this,"服务器繁忙",Toast.LENGTH_LONG).show();}});}
}
🍄 注册MusicListActivity

在AndroidManifest.xml中注册MusicListActivity,并将其设置为启动页,具体代码如下:

<activity android:name=".MusicListActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

🍄测试效果

启动模拟器,运行程序,效果如下所示:

🌳 歌曲详情页

🌾 后端查询歌曲详情

🍄编写查询接口

编写查询单曲的接口,调用业务端,传入id根据id查找歌曲,查询完毕之后,将查询出来的结果封装到Result中并转化为json对象,并返回给客户端。

package com.softeem.webService.controller;import com.alibaba.fastjson2.JSONObject;
import com.softeem.webService.service.MusicService;
import com.softeem.webService.util.Result;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/music")
public class MusicController extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 获取请求参数中的music_idint id = Integer.parseInt(req.getParameter("music_id"));// 创建业务端MusicService service = new MusicService();// 业务端根据id获取音乐,并封装成resultResult result = service.getMusicById(id);// 将result转换为json对象JSONObject jsonObject = JSONObject.from(result);// 返回数据到客户端PrintWriter out = resp.getWriter();out.println(jsonObject);}
}
🍄 编写业务端

在业务端调用dao,根据id查询歌曲详情,并封装到result对象中,具体代码如下:

public Result getMusicById(int id) {MusicDao dao = new MusicDao();Music music = dao.findMusicById(id);return Result.success(music);
}
🍄 编写Dao

在Dao中使用工具类,根据id查询出歌曲信息,具体代码如下:

public Music findMusicById(int id) {String sql = "select * from music where id=?";return DBUtils.queryOne(Music.class,sql,id);
}
🍄 测试

运行服务器测试,输入以下请求地址进行测试:

🌾 前端展示歌曲详情

🍄 编写显示详情布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#000000"><TextViewandroid:id="@+id/music_name"android:text="旺财小宝贝"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="30sp"android:textColor="#FFFFFF"android:layout_marginTop="10dp"></TextView><TextViewandroid:id="@+id/music_author"android:text="攀哥"android:layout_width="match_parent"android:gravity="center"android:layout_height="wrap_content"android:textSize="30sp"android:textColor="#FFFFFF"android:layout_marginBottom="30dp"android:layout_marginTop="10dp"></TextView><LinearLayoutandroid:layout_height="wrap_content"android:id="@+id/linearLayout1"android:layout_width="match_parent"android:gravity="center"><ImageButtonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:id="@+id/play"android:src="@drawable/play"></ImageButton><ImageButtonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:id="@+id/pause"android:src="@drawable/pause"></ImageButton><ImageButtonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:id="@+id/stop"android:src="@drawable/stop"></ImageButton></LinearLayout></LinearLayout>

🍄 给列表选项添加点击监听器

在MusicListActivity中给ListView添加子选项点击事件监听器,代码如下:

在oncreate()方法中添加如下方法:

// 给列表视图添加点击事件
musicListView.setOnItemClickListener(this);

添加onItemClick方法:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {TextView tv = view.findViewById(R.id.music_id);String music_id = tv.getText().toString();Intent it = new Intent(this,MusicActivity.class);it.putExtra("music_id",music_id);startActivity(it);}
🍄编写MusicActivity展示歌曲详情

在MusicActivity中将music_id发送给服务端,让服务端根据music_id查询数据,并将返回的数据设置到详情页中,具体代码如下:

package com.moxuan.mytest;import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.Nullable;import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.util.ArrayList;
import java.util.List;import cz.msebera.android.httpclient.Header;public class MusicActivity extends Activity {private ImageButton play,pause,stop;private MediaPlayer mp;private TextView music_name;private TextView music_author;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.music);play = findViewById(R.id.play);pause = findViewById(R.id.pause);stop = findViewById(R.id.stop);music_name = findViewById(R.id.music_name);music_author = findViewById(R.id.music_author);Intent it = getIntent();String music_id = it.getStringExtra("music_id");RequestParams requestParams = new RequestParams();requestParams.add("music_id", music_id);new AsyncHttpClient().post("http://172.17.29.89:8080/music", requestParams, new AsyncHttpResponseHandler() {/*** 当服务器成功响应时会执行的方法** @param status       服务器当前的状态, 值为200时,代表着服务成功处理请求,并返回了数据* @param headers* @param responseBody 服务器返回的数据*/@Overridepublic void onSuccess(int status, Header[] headers, byte[] responseBody) {// 如果服务器成功返回数据if (status == 200) {// 将返回的数据转换成json对象try {JSONObject jsonObject = new JSONObject(new String(responseBody));// 获取json数组,数组中存放的是音乐数据JSONObject music_str = jsonObject.getJSONObject("data");music_name.setText("歌曲名:" + music_str.getString("name"));music_author.setText("歌手:" + music_str.getString("author"));} catch (JSONException e) {e.printStackTrace();}}}/*** 如果服务器响应失败会执行的方法** @param i* @param headers* @param bytes* @param throwable*/@Overridepublic void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {Toast.makeText(MusicActivity.this, "服务器繁忙", Toast.LENGTH_LONG).show();}});}
}
🍄 测试效果

相关文章:

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…...

EasyX图形库的安装

前言 EasyX是一个图形库&#xff0c;可以用来做一些c/c小游戏&#xff0c;帮助学习。 一、进入EasyX官网 https://easyx.cn/ 二、点击下载EasyX 三、下载好后以管理员身份运行它 四、点击下一步 五、然后它会自动检测你的编辑器&#xff0c;用哪个就在哪个点安装 六、安装成功…...

数据结构 - 队列

队列也是一种操作受限的线性数据结构&#xff0c;与栈很相似。 01定义 栈的操作受限表现为只允许在队列的一端进行元素插入操作&#xff0c;在队列的另一端只允许删除操作。这一特性可以总结为先进先出&#xff08;First In First Out&#xff0c;简称FIFO&#xff09;。这意味…...

基于springboot美食推荐商城的设计与实现

基于springboot美食推荐商城的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https:…...

React开发一个WebSocket

export default class SocketService {static instance null;static get Instance() {if (!this.instance) {this.instance new SocketService();}return this.instance;}// 和服务端连接的socket对象ws null;// 存储回调函数callBackMapping {};// 标识是否连接成功connec…...

Oracle DECODE 丢失时间精度的原因与解决方案

在Oracle数据库中&#xff0c;DECODE 函数是一个非常实用的条件处理函数&#xff0c;通常用于替代简单的 CASE WHEN 语句。它根据给定的值列表进行匹配&#xff0c;如果匹配成功则返回相应的值。如果不匹配&#xff0c;返回一个默认值。 问题描述 SELECT DECODE(-21, -1, NU…...

如何用示波器检测次级点火系统(一)

写在最前面&#xff1a; 单看标题可能会让你觉得这篇文章的主题是关于检测线圈&#xff0c;火花塞和火花塞插头电线。但我们指的是分析燃烧室内电子的行为。目标是看燃料混合物&#xff0c;阀座&#xff0c;压缩&#xff0c;积碳和其它影响这种特性的症状。最终目的是要学会分…...

基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…...

bmp怎么转换为jpg?快速批量将bmp转换为jpg

bmp怎么转换为jpg&#xff1f;在日常的数字生活中&#xff0c;我们时常会遇到各种格式的图片文件&#xff0c;它们各自拥有不同的特点和用途。最近&#xff0c;我遇到了一个有趣的小插曲&#xff1a;我从网络上下载了一张精美的BMP格式图片&#xff0c;打算用它作为一篇报告的背…...

centos8配置java环境变量jdk8u422-b05

1. 下载 JDK 8u422-b05 首先&#xff0c;确保已经下载了 JDK 8u422-b05 的二进制文件。如果还没有下载&#xff0c;你可以去 Oracle 官方网站或者其他可信的源下载 JDK 8u422。 2. 安装 JDK 将下载的 JDK 文件解压到 /usr/local/java 目录下&#xff1a; sudo mkdir /usr/l…...

基于SSM的校园拓展活动管理系统

文未可获取一份本项目的java源码和数据库参考。 1 选题背景 校园文化是精神的载体&#xff0c;是青年成长成才的沃土&#xff0c;是一种体现校园的硬件设施、精神风貌、制度体系、办学理念以及办学特色的综合文化。文明程度高、文化气息浓、活动种类多的校园文化不仅能焕发学校…...

Python随机森林算法详解与案例实现

目录 Python随机森林算法详解与案例实现1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例&#xff1a;使用随机森林预测鸢尾花品种4.1 数据集介绍4.2 代码实现4.3 代码解释4.4 运行结果 5、回归案例&#xff1a;使用随机森林预测波士顿房价5.1 数据集介绍5.2 代码实…...

提示词高级阶段学习day2.1-在提示词编写中对{}的使用教程

首先在 prompt engineering 中&#xff0c;使用 {} 通常是为了标识占位符或变量&#xff0c; 这些占位符可以在实际生成内容时被动态替换。 通过这种方式&#xff0c;prompt 可以更加通用和灵活&#xff0c;适用于不同的输入数据场景。 以下是一个体系化、结构化的教程&…...

2024年,每一个大模型都躲不过容嬷嬷和紫薇

2024年还不上视频生成的大模型公司&#xff0c;还能上桌吃饭吗&#xff1f; 连最积极搞AI的李彦宏&#xff0c;在这件事上也迟疑了。 “百度不碰Sora类的视频生成方向。”李彦宏在近期的2024年Q3总监会上说道。原因在于&#xff0c;10年、20年都可能难以商业化应用。 从Open…...

SpringBoot之RedisTemplate基本配置

公司要求redis配置密码使用密文&#xff0c;但是程序使用的是spring默认的redisTemplate&#xff0c;那么就需要修改配置实现密码加解密。 先搞个加密工具类&#xff1a; public class SM2Encryptor {// 加密&#xff0c;使用公钥public static String encryptText(String pub…...

SparseRCNN 模型,用于目标检测任务

SparseRCNN 模型,用于目标检测任务 import logging import math from typing import Listimport numpy as np import torch import torch.distributed as dist import torch.nn.functional as F from torch import nn #项目完整代码下载链接:https://download.csdn.net/downl…...

【AIGC】第一性原理下的ChatGPT提示词Prompt设计:系统信息与用户信息的深度融合

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;第一性原理与ChatGPT提示词Prompt设计应用第一性原理于ChatGPT提示词Prompt设计系统信息和用户信息的融合实际应用结论 &#x1f4af;系统信息与用户信息的定义和重要性系…...

DeepSpeed性能调优与常见问题解决方案

1. 引言 什么是DeepSpeed&#xff1f; DeepSpeed是由微软开源的深度学习训练优化库&#xff0c;旨在帮助研究人员和工程师高效地训练大规模深度学习模型。基于PyTorch框架&#xff0c;DeepSpeed提供了一系列先进的技术&#xff0c;如ZeRO&#xff08;Zero Redundancy Optimiz…...

【GESP】C++一级练习BCQM3052,鸡兔同笼

GESP一级知识点&#xff1a;for循环和if的应用。 题目题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3052/ 【GESP】C一级练习BCQM3052&#xff0c;鸡兔同笼 | OneCoderGESP一级知识点&#xff1a;for循环和if的应用。https://www.coderli.com/gesp-1-bcqm3052/ …...

Android面试之5个性能优化相关的深度面试题

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”&#xff0c;和我一起每天进步一点点 面试题目1&#xff1a;如何优化Android应用的启动速度&#xff1f; 解答&#xff1a; 优化Android应用的启动速度可以从以下几个方面入手&#xff1a; 1、 减少主线程工…...

R语言机器学习算法实战系列(六)K-邻近算法 (K-Nearest Neighbors)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结系统信息介绍 K-邻…...

FPGA图像处理之构建3×3矩阵

免责声明&#xff1a;本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…...

【Linux】进程间通信(匿名管道)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSI…...

memset()函数的实现

memset()函数的实现 _CRTIMP void* __cdecl memset (void*, int, size_t); memset()函数的实现 文章目录 memset()函数的实现memset()函数 memset()函数 _CRTIMP void* __cdecl memset (void*, int, size_t);void* memset(void* src, int val, size_t count) {char *char_src…...

STM32CUBEIDE FreeRTOS操作教程(七):queue队列

STM32CUBEIDE FreeRTOS操作教程&#xff08;七&#xff09;&#xff1a;queue队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#xff…...

类型转换与字符串操作:数据的灵活变形!

Java中的隐式与强制类型转换&#xff1a;让你轻松驾驭数据 在编程的世界中&#xff0c;数据的类型如同游戏中的角色&#xff0c;赋予它们不同的特性与能力。而在Java中&#xff0c;隐式类型转换与强制类型转换就像是两把利剑&#xff0c;帮助我们在这个复杂的世界中游刃有余。…...

动态规划18:188. 买卖股票的最佳时机 IV

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;188.…...

YOLOv8改进 - 注意力篇 - 引入ShuffleAttention注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了ShuffleAttention注意力在YOLOv8中的使用。包含ShuffleAttention原理分析&#xff0c;ShuffleAttention的代码、ShuffleAttention的使用方法、以及添加以后的yaml文件及运行记录。 二、ShuffleAttention原理分析 ShuffleA…...

基于Multisim的8路彩灯循环控制电路设计与仿真

1)由八个彩灯LED的明暗构成各种彩灯图形; 2)彩灯依次显示的图形: 彩灯从左至右渐亮至全亮(8个CP) 彩灯从左至右渐灭至全灭(8个CP) 彩灯从右至左渐亮至全亮(8个CP) 彩灯从右至左渐灭至全灭(8个CP) 彩灯全亮(1个CP) 彩灯全灭(1个CP) 彩灯全亮(1个CP) 彩灯全灭(1个CP) 3)彩灯图形循…...

完整的模型训练套路 pytorch

**前置知识&#xff1a; 1、 &#xff08;1&#xff09;.train()&#xff1a;将模型设置为训练模式 &#xff08;2&#xff09;.eval()&#xff1a;将模型设置为评估模式 不写也可以&#xff08;只对特定网络模型有作用&#xff0c;如含有Dropout的&#xff09; 2、 with…...