✨作者主页:IT研究室✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目
文章目录
- 一、前言
- 二、开发环境
- 三、系统界面展示
- 四、代码参考
- 五、论文参考
- 六、系统视频
- 结语
一、前言
随着社会的不断进步和人们生活水平的提高,人们对于着装的需求和品味也日益提升。在繁忙的生活节奏中,如何选择适合自己的服装搭配成为了一个重要的问题。因此,开发一款能够提供便捷、个性化的穿搭推荐系统变得十分必要。
现有的穿搭推荐解决方案大多依赖于传统的推荐算法或者人工咨询,存在以下问题:
人工咨询需要大量的人力资源,且难以保证咨询的质量和效率。当用户数量较大时,人工咨询往往无法满足用户的需求。
传统的推荐算法往往只考虑用户的购买历史和浏览行为,忽略了许多其他因素,如天气、场合、个人风格等,这使得推荐结果往往不够精准,难以满足用户的个性化需求。
因此,开发一款综合考虑多种因素,能够根据用户的个人特点和环境变化做出动态推荐的穿搭推荐系统,具有强烈的必要性。
本课题旨在开发一款基于微信小程序或安卓APP的穿搭推荐系统,实现以下功能:
提供用户个性化的穿搭推荐:系统可以通过对用户的个人信息、历史记录等进行分析,生成符合用户个性化需求的穿搭推荐。
根据天气、场合等因素做出动态调整:根据当天的天气预报、用户所处的场合等因素,系统可以自动调整穿搭推荐,为用户提供更加精准的建议。
管理用户的穿搭圈和我的搭配等个人信息:用户可以方便地管理自己的穿搭圈和我的搭配等信息,以便更好地了解自己的着装习惯和喜好。
管理人员可以管理穿搭圈的内容和用户信息:管理人员可以通过系统后台对穿搭圈的内容进行管理,同时也可以对用户信息进行查看和管理。
通过这些功能,本课题的研究目的在于提高穿搭推荐的准确性和用户满意度,同时提高系统的灵活性和可维护性。具体来说,本课题的研究目的包括:
针对用户个性化需求的深入研究:通过对用户历史数据和偏好进行分析,构建用户画像,为每个用户提供个性化的穿搭推荐。
结合天气、场合等因素的推荐算法研究:结合天气预报和用户所处的场合等信息,设计一种动态调整的推荐算法,提高推荐的精准度和实用性。
提升用户体验的设计研究:通过优化界面设计、操作流程等功能,提高用户体验,使用户更愿意使用本系统。
系统可维护性和灵活性的提升:通过设计合理的系统架构和代码结构,提高系统的可维护性和灵活性,方便后续的扩展和维护。
本课题的研究意义在于:
提供用户个性化的穿搭推荐服务:通过本系统的穿搭推荐功能,用户可以更加方便地获取适合自己的服装搭配建议,提高着装品味和自信心。
满足用户在不同场合、不同天气的着装需求:本系统结合天气预报和用户所处的场合等因素进行动态调整,为用户提供更加精准的推荐结果。
提高穿搭推荐的准确性和用户满意度:通过深入研究用户需求和优化推荐算法,提高推荐的准确性和用户满意度,使用户更愿意使用本系统。
二、开发环境
- 开发语言:Java
- 数据库:MySQL
- 系统架构:B/S
- 后端:SpringBoot
- 前端:微信小程序/Android+uniapp+Vue
三、系统界面展示
- 一周穿搭推荐微信小程序/安卓APP界面展示:
四、代码参考
- 微信小程序/安卓APP项目实战代码参考:
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.user_fragment, container, false);
userName = view.findViewById(R.id.userName);
clothesNum = view.findViewById(R.id.clothesNum);
matchNum = view.findViewById(R.id.matchNum);
userImg = view.findViewById(R.id.userImg);
setImg = view.findViewById(R.id.setImg);
addMatchBtn = view.findViewById(R.id.addMatchBtn);
matchListView = view.findViewById(R.id.myMatchList);
bar = view.findViewById(R.id.progressBar);
nodata = view.findViewById(R.id.nodataText);
return view;
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = new ViewModelProvider(this).get(UserViewModel.class);
// TODO: Use the ViewModel
init();
getClothesAndMatchNum();
initMatchAdapter();
//进入设置页面
setImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), SettingActivity.class);
startActivityForResult(intent, 3);
}
});
//进入添加搭配界面
addMatchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent addMatchIntent = new Intent(getActivity(), AddMatchActivity.class);
addMatchIntent.putExtra("m_flag", 1);
startActivityForResult(addMatchIntent, 10);
}
});
handler = new Handler(){
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)
@Override
public void handleMessage(@NonNull Message msg){
if(msg.what == 1){
Log.i(TAG, "handleMessage: 收到消息——衣物数量");
int res = (int) msg.obj;
clothesNum.setText(String.valueOf(res));
}else if(msg.what == 2){
Log.i(TAG, "handleMessage: 收到消息——搭配数量");
int res = (int) msg.obj;
matchNum.setText(String.valueOf(res));
}else if(msg.what == 3){
//接收消息
int res = (int) msg.obj;
if(res == 1){
Log.i(TAG, "done: 查询match成功");
Log.i(TAG, "handleMessage: 衣物数量:"+matchList.size());
matchListAdapter.notifyDataSetChanged();
}else if(res == 2){
//查询帖子失败
Log.i(TAG, "done: 查询match失败");
Toast.makeText(getActivity().getApplicationContext(), "刷新失败", Toast.LENGTH_SHORT).show();
}
//切换显示状态
bar.setVisibility(View.GONE);
//没有获得数据时显示
matchListView.setEmptyView(nodata);
matchListView.setVisibility(View.VISIBLE);
}else if(msg.what == 4){
Log.i(TAG, "handleMessage: 收到删除某件衣物的消息");
//更新适配器
matchListAdapter.notifyDataSetChanged();
//更新搭配数目
String matchNumTmp = matchNum.getText().toString();
int matchNumTmpInt = Integer.valueOf(matchNumTmp)-1;
matchNum.setText(matchNumTmpInt+"");
}
super.handleMessage(msg);
}
};
Thread thread = new Thread(selectMatchRun);
thread.start();
}
public void init(){
//检查sharedPreference,获取用户名
SharedPreferences sp = getActivity().getSharedPreferences("user", Activity.MODE_PRIVATE);
PreferenceManager.getDefaultSharedPreferences(getActivity());
userNameStr = sp.getString("user_name","");
userImgStr = sp.getString("user_img","");
userId = sp.getInt("user_id",0);
jdbcUrl = sp.getString("jdbc_url", "");
jdbcUser = sp.getString("jdbc_user","");
jdbcPassword = sp.getString("jdbc_password","");
userName.setText(userNameStr);
Bitmap bitmap = ImageUtil.base64ToImage(userImgStr);//设置头像
userImg.setImageBitmap(bitmap);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == 3 && resultCode == 4){
//从 设置 页面返回
//刷新界面
//检查sharedPreference,获取用户头像
SharedPreferences sp = getActivity().getSharedPreferences("user", Activity.MODE_PRIVATE);
PreferenceManager.getDefaultSharedPreferences(getActivity());
String usernameStr = sp.getString("user_name","");
userName.setText(usernameStr);
String userImgStr = sp.getString("user_img","");
Bitmap bitmap = ImageUtil.base64ToImage(userImgStr);//设置头像
userImg.setImageBitmap(bitmap);
}else if(requestCode == 10 && resultCode == 20){
//添加搭配后,更新衣物的信息,更新adapter
Thread thread = new Thread(selectMatchRun);
thread.start();
//更新搭配数目
String matchNumTmp = matchNum.getText().toString();
int matchNumTmpInt = Integer.valueOf(matchNumTmp)+1;
matchNum.setText(matchNumTmpInt+"");
} else if(requestCode == 30 && resultCode == 40){
//更改match信息后,更新adapter
Thread thread = new Thread(selectMatchRun);
thread.start();
}
super.onActivityResult(requestCode, resultCode, data);
}
//初始化每个分类下 衣物列表
@RequiresApi(api = Build.VERSION_CODES.N)
private void initMatchAdapter() {
matchListAdapter = new MatchListAdapter(getActivity(), R.layout.clothes_of_match, matchList);
matchListView.setAdapter(matchListAdapter);
//点击事件
matchListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(TAG, "onItemClick: 点击position:"+position);
Match alterMatch = (Match) matchListView.getItemAtPosition(position);
//跳转修改界面
Intent alterMatchIntent = new Intent(getActivity(), AddMatchActivity.class);
alterMatchIntent.putExtra("m_flag", 2);
alterMatchIntent.putExtra("m_id", alterMatch.getM_id());
alterMatchIntent.putExtra("m_time", alterMatch.getM_time());
alterMatchIntent.putExtra("m_style", alterMatch.getM_style());
Bundle bundle = new Bundle();
Bitmap bitmap = ImageUtil.base64ToImage(alterMatch.getM_img());
bundle.putBinder("m_img", new BitmapBinder(bitmap));
alterMatchIntent.putExtras(bundle);
startActivityForResult(alterMatchIntent, 30);
}
});
matchListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("提示")
.setMessage("请确认是否删除当前数据?")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.i(TAG, "onClick: 删除对话框事件处理");
Match match = (Match) matchListView.getItemAtPosition(position);
m_id = match.getM_id();
//删除arraylist中信息
matchList.remove(match);
//开启线程,从数据库中删除该记录
Thread thread2 = new Thread(deleteMatchRun);
thread2.start();
Log.i(TAG, "onActivityCreated: DB删除记录");
}
}).setNegativeButton("否", null);
builder.create().show();
return true;
}
});
matchListAdapter.notifyDataSetChanged();
}
private void getClothesAndMatchNum(){
//开启线程
Thread thread = new Thread(getClothesAndMatchNumRun);
thread.start();
}
//获取单品数量、搭配数量——msg1、2
private Runnable getClothesAndMatchNumRun = new Runnable() {
@Override
public void run() {
int clothesNum=0, matchNum=0;
//查询数据库中是否存在该用户名——存在弹窗提示
try {
Class.forName("com.mysql.jdbc.Driver");
Connection cn = DriverManager.getConnection(jdbcUrl, jdbcUser ,jdbcPassword);
String sql = "select count(*) from clothes where c_uid = "+userId;
Statement st = (Statement)cn.createStatement();
ResultSet rs = st.executeQuery(sql);
System.out.println("查找成功");
if(rs.next())
clothesNum = rs.getInt(1);
rs.close();
String sql2 = "select count(*) from matches where m_uid = "+userId;
ResultSet rs2 = st.executeQuery(sql2);
System.out.println("查找成功");
if(rs2.next())
matchNum = rs2.getInt(1);
rs2.close();
st.close();
cn.close();
} catch (ClassNotFoundException | SQLException e) {
Log.i(TAG, "run:SQL fail!!!__" + e);
e.printStackTrace();
}
//发送消息
Message msg = handler.obtainMessage(1, clothesNum);
handler.sendMessage(msg);
Message msg2 = handler.obtainMessage(2, matchNum);
handler.sendMessage(msg2);
Log.i(TAG, "run: 消息已发送---查询衣物和搭配数量");
}
};
//创建线程类,实现Runnable接口,用于查询所有衣物信息——msg3
private Runnable selectMatchRun = new Runnable() {
@Override
public void run() {
try {
Log.i(TAG, "run: 开始查询所有match111");
Class.forName("com.mysql.jdbc.Driver");
Connection cn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
String sql = "select * from matches where m_uid="+userId;
Statement st = (Statement)cn.createStatement();
int resCode;
try {
ResultSet rs = st.executeQuery(sql);
System.out.println("连接数据库成功");
rs.last(); // 将光标移动到最后一行
int rowCount = rs.getRow(); // 得到当前行号,即结果集记录数
Log.i(TAG, "run: 数量rowcount:"+rowCount);
rs.beforeFirst();//将光标移回首行
matchList.clear();
//查询出数据,将其放在List<Match>中,使用adapter将其显示在列表里
while (rs.next()){
Match match = new Match();
match.setM_id(rs.getInt("m_id"));
match.setM_img(rs.getString("m_img"));
match.setM_time(rs.getString("m_time"));
match.setM_style(rs.getString("m_style"));
matchList.add(match);
}
resCode = 1;
rs.close();
} catch (SQLException e) {
Log.i(TAG, "run:SQL fail!!!__"+e);
e.printStackTrace();
resCode = 2;
}
//发送消息
Message msg = handler.obtainMessage(3, resCode);
handler.sendMessage(msg);
Log.i(TAG, "run: 消息已发送---查询结果");
st.close();
cn.close();
} catch (ClassNotFoundException | SQLException e) {
Log.i(TAG, "run:SQL fail!!!__"+e);
e.printStackTrace();
}
}
};
//长按删除衣物——msg4
private Runnable deleteMatchRun = new Runnable() {
@Override
public void run() {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection cn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
String sql = "delete from matches where m_id = "+ m_id;
Statement st = (Statement) cn.createStatement();
int result = st.executeUpdate(sql);// 返回值代表收到影响的行数
System.out.println("删除match——连接数据库成功");
//发送消息
Message msg = handler.obtainMessage(4, result);
handler.sendMessage(msg);
Log.i(TAG, "run: 消息已发送---删除结果");
st.close();
cn.close();
} catch (ClassNotFoundException | SQLException e) {
Log.i(TAG, "run:SQL fail!!!__" + e);
e.printStackTrace();
}
}
};
}
五、论文参考
- 计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP论文参考:
六、系统视频
一周穿搭推荐微信小程序/安卓APP项目视频:
计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP
结语
计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP-项目实战
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:⬇⬇⬇
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目