• 计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP-项目实战


    作者主页:IT研究室✨
    个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
    ☑文末获取源码☑
    精彩专栏推荐⬇⬇⬇
    Java项目
    Python项目
    安卓项目
    微信小程序项目

    一、前言

    随着社会的不断进步和人们生活水平的提高,人们对于着装的需求和品味也日益提升。在繁忙的生活节奏中,如何选择适合自己的服装搭配成为了一个重要的问题。因此,开发一款能够提供便捷、个性化的穿搭推荐系统变得十分必要。

    现有的穿搭推荐解决方案大多依赖于传统的推荐算法或者人工咨询,存在以下问题:
    人工咨询需要大量的人力资源,且难以保证咨询的质量和效率。当用户数量较大时,人工咨询往往无法满足用户的需求。
    传统的推荐算法往往只考虑用户的购买历史和浏览行为,忽略了许多其他因素,如天气、场合、个人风格等,这使得推荐结果往往不够精准,难以满足用户的个性化需求。
    因此,开发一款综合考虑多种因素,能够根据用户的个人特点和环境变化做出动态推荐的穿搭推荐系统,具有强烈的必要性。

    本课题旨在开发一款基于微信小程序或安卓APP的穿搭推荐系统,实现以下功能:
    提供用户个性化的穿搭推荐:系统可以通过对用户的个人信息、历史记录等进行分析,生成符合用户个性化需求的穿搭推荐。
    根据天气、场合等因素做出动态调整:根据当天的天气预报、用户所处的场合等因素,系统可以自动调整穿搭推荐,为用户提供更加精准的建议。
    管理用户的穿搭圈和我的搭配等个人信息:用户可以方便地管理自己的穿搭圈和我的搭配等信息,以便更好地了解自己的着装习惯和喜好。
    管理人员可以管理穿搭圈的内容和用户信息:管理人员可以通过系统后台对穿搭圈的内容进行管理,同时也可以对用户信息进行查看和管理。
    通过这些功能,本课题的研究目的在于提高穿搭推荐的准确性和用户满意度,同时提高系统的灵活性和可维护性。具体来说,本课题的研究目的包括:

    针对用户个性化需求的深入研究:通过对用户历史数据和偏好进行分析,构建用户画像,为每个用户提供个性化的穿搭推荐。
    结合天气、场合等因素的推荐算法研究:结合天气预报和用户所处的场合等信息,设计一种动态调整的推荐算法,提高推荐的精准度和实用性。
    提升用户体验的设计研究:通过优化界面设计、操作流程等功能,提高用户体验,使用户更愿意使用本系统。
    系统可维护性和灵活性的提升:通过设计合理的系统架构和代码结构,提高系统的可维护性和灵活性,方便后续的扩展和维护。

    本课题的研究意义在于:
    提供用户个性化的穿搭推荐服务:通过本系统的穿搭推荐功能,用户可以更加方便地获取适合自己的服装搭配建议,提高着装品味和自信心。
    满足用户在不同场合、不同天气的着装需求:本系统结合天气预报和用户所处的场合等因素进行动态调整,为用户提供更加精准的推荐结果。
    提高穿搭推荐的准确性和用户满意度:通过深入研究用户需求和优化推荐算法,提高推荐的准确性和用户满意度,使用户更愿意使用本系统。

    二、开发环境

    • 开发语言:Java
    • 数据库:MySQL
    • 系统架构:B/S
    • 后端:SpringBoot
    • 前端:微信小程序/Android+uniapp+Vue

    三、系统界面展示

    • 一周穿搭推荐微信小程序/安卓APP界面展示:
      一周穿搭推荐微信小程序/安卓APP-穿搭圈信息
      一周穿搭推荐微信小程序/安卓APP-我的搭配信息
      一周穿搭推荐微信小程序/安卓APP-天气信息
      一周穿搭推荐微信小程序/安卓APP-风格类型管理
      一周穿搭推荐微信小程序/安卓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中,使用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();
                }
            }
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322

    五、论文参考

    • 计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP论文参考:
      计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP论文参考

    六、系统视频

    一周穿搭推荐微信小程序/安卓APP项目视频:

    计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP

    结语

    计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP-项目实战
    大家可以帮忙点赞、收藏、关注、评论啦~
    源码获取:⬇⬇⬇

    精彩专栏推荐⬇⬇⬇
    Java项目
    Python项目
    安卓项目
    微信小程序项目

  • 相关阅读:
    【springboot3.x 记录】关于spring-cloud-gateway引入openfeign导致的循环依赖问题
    大华相机C#学习之IDevice类
    CMS之织梦导航二级下拉菜单
    RT-DETR优化改进:IoU系列篇 | Inner-IoU融合MPDIoU,创新十足,2023年11月最新IoU改进
    Redis 分布式锁
    java计算机毕业设计实验课程学习系统(附源码、数据库)
    5G定位系统,实现通信服务和定位功能一体化
    R语言在vector向量数据末尾追加新的元素(在已知向量末尾添加单个标量数据形成新的向量)
    前端开发流程
    力扣学习记录(每日更新)
  • 原文地址:https://blog.csdn.net/2301_79456892/article/details/134417132