当前位置:   article > 正文

毕业设计:基于python商品销售数据分析可视化系统 营销数据 商品数据 django框架(包含文档+源码+部署教程)_基于python的篮球鞋销售数据分析与可视化系统住主要用于解决消费者的那些问题

基于python的篮球鞋销售数据分析与可视化系统住主要用于解决消费者的那些问题

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 。

在这里插入图片描述

1、摘 要

在目前社会,有很大一部分的行业开始实现大屏数据可视化,甚至将其作为公司宣传亮点而发展下去,大屏数据可视化是以大屏为主要展示载体的数据可视化设计。超市采用这种系统作为展示不仅可以帮助超市管理者管理库存,了解营收,更方便工作人员合理安排补货等相关工作。因此大屏的超市营收数据可视化系统对一个超市来说十分重要。
通过可视化展示超市的销售额、销售量、客流量等数据,及时了解超市的营收情况,发现潜在的经营风险,及时调整经营策略,保证超市的稳健发展;还可以分析销售数据,挖掘市场潜力,通过数据可视化的方式对销售数据进行深度挖掘和分析,发现超市的热销商品、消费者的购买偏好和消费习惯等信息,进而制定更加精准的市场营销策略,开拓更多的市场空间,提高超市的市场竞争力;同时还可以辅助决策,提高经营效率,通过可视化展示超市的库存、进货、销售等信息,帮助超市管理者更好地掌握商品的销售状况和库存情况,优化进货计划和销售策略,提高超市的经营效率和利润率;最后还可以提高员工管理效率,通过数据可视化的方式展示员工的工作绩效、考核成绩等信息,帮助管理者更好地了解员工的工作情况,发现员工的优缺点,进而制定更加科学的培训计划和考核标准,提高员工的工作效率和工作质量,达到最初设计要求。

关键词:超市营收数据管理;管理系统;数据库

系统总共分为四大模块,分别为可视化模块、用户模块、商品数据管理模块、公告模块,系统功能结构图

在这里插入图片描述

2、系统设计

系统可视化界面如下图所示,界面以柱状图、折线图、饼图等形式展示了超市营收数据,并以表格形式展现了订单相关信息,管理员将数据保存到对应数据库后,则通过Flask框架构建数据服务接口,通过PyMysql查询并格式化数据,将数据进行分析与处理,最终传递给前端,前端利用Echarts技术进行可视化渲染,最终将最直观、最科学的数据分析内容呈现给用户。

在这里插入图片描述

用户验证界面,此界面是输入错误信息登录显示的情况;当输入正确的账号密码信息后进入的用户管理界面如下图,此时便可以对用户进行管理,可进行新增、修改、删除、查看等操作。

在这里插入图片描述

商品管理功能包含了商品数据的新增、删除、修改、查看功能。商品数据管理界面如下。商品类型管理功能包含了类型的新增、修改、删除、查看功能。商品类型管理界面如商品订单管理功能包含订单的新增、删除、修改、查看功能。订单数据管理界面如示。这些操作是建立在登录账号的基础上,首先需要登录进入由Layui构建的后台管理页面,然后点击菜单,进入数据管理页面,页面会通过ajax异步请求的方式加载Flask构建的后端数据,最终以列表的形式展示。在列表页面,可以输入信息进行搜索,也可以操作列表中的任意一条数据进行删除或修改。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当用户登录进入可视化系统后,普通用户可以直接进入发布公告的也米娜,管理员则需要点击进入系统模块,页面同样也会通过ajax异步请求的方式加载Flask构建的后端数据,最终以弹窗的形式展示系统最新公告。在公告的列表页面,可以输入信息进行搜索,也可以操作列表中的任意一条数据进行删除或修改。公告管理界面如下,当进入公告界面有新公告发布时界面如在这里插入图片描述

3、部分代码

import datetime

from flask import Flask as _Flask, flash, redirect
from flask import request, session
from flask import render_template
from flask.json import JSONEncoder as _JSONEncoder, jsonify
import decimal

import os

from service import user_service, notice_service, category_service, order_service, goods_service, data_service
from utils.JsonUtils import read_json
from utils.Result import Result

base = os.path.dirname(__file__)
directory_path = os.path.dirname(__file__)
json_path = directory_path + '/static/api/'


class JSONEncoder(_JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return float(o)
        if isinstance(o, datetime.datetime):
            return o.strftime("%Y-%m-%d %H:%M:%S")
        if isinstance(o, datetime.date):
            return o.strftime("%Y-%m-%d")
        super(_JSONEncoder, self).default(o)


class Flask(_Flask):
    json_encoder = JSONEncoder


import os

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = os.urandom(24)


# ----------------------------------------------页面加载模块开始----------------------------------------------
# 加载系统json文件
@app.route('/api/<string:path>/')
def api_json(path):
    if path == 'init.json' and session.get('user') and session.get('user')['type'] == 1:
        path = 'custom_init.json'
    return read_json(json_path + path)


# 加载page下的静态页面
@app.route('/page/<string:path>')
def api_path(path):
    return render_template("page/" + path)


# 系统默认路径后台跳转
@app.route('/admin')
def admin_page():
    if session.get('user') and session.get('user')['id'] > 0:
        return render_template("index.html")
    else:
        return redirect("/login")


# 系统可视化数据请求接口
@app.route('/')
def main_page():
    category_sales_volume = data_service.get_category_sales_volume()
    category_goods_name = data_service.get_category_goods_name()
    sale, gain, order_num = data_service.get_total()
    sales_num_list = data_service.get_category_sum_sales()
    category_selling_list = data_service.get_category_selling()
    times_selling = data_service.get_times_selling()
    months_selling = data_service.get_months_selling()
    table_list = data_service.get_table_list()
    return render_template("main.html", category_sales_volume=category_sales_volume,
                           category_goods_name=category_goods_name, sale=sale, gain=gain, order_num=order_num,
                           sales_num_list=sales_num_list, category_selling_list=category_selling_list,
                           times_selling=times_selling, months_selling=months_selling, table_list=table_list)


# 系统登录路径
@app.route('/login')
def login_page():
    return render_template("page/login.html")


# 系统退出登录路径
@app.route('/logout')
def logout_page():
    session.clear()
    return redirect("/login")


# 系统注册用户
@app.route('/register', methods=['get'])
def register_page():
    return render_template("page/register.html")


# ----------------------------------------------页面加载模块结束----------------------------------------------


# ----------------------------------------------用户相关模块开始----------------------------------------------
# 用户注册
@app.route('/register', methods=['post'])
def register_user():
    form = request.form.to_dict()  # 获取值
    result = user_service.insert_user(form)
    return result.get()


# 用户登录
@app.route('/login', methods=['post'])
def login_user():
    form = request.form.to_dict()  # 获取值
    result = user_service.select_user_by_account_password(form)
    session['user'] = result.data
    return result.get()


# 用户数据分页
@app.route('/page/user/add', methods=['get'])
def page_user_add():
    return render_template("page/user/add.html")


# 用户修改密码
@app.route('/user/reset/password', methods=['post'])
def reset_password_user():
    form = request.form.to_dict()  # 获取值
    result = user_service.reset_password(form['old_password'], form['new_password'], form['again_password'])
    return result.get()


@app.route('/add/user', methods=['post'])
def add_user():
    form = request.form.to_dict()
    result = user_service.insert_user(form)
    return result.get()


# 用户编辑页面
@app.route('/page/user/edit', methods=['get'])
def page_user_edit():
    id = request.args.get('id')
    user = user_service.get_user(id)
    return render_template("page/user/edit.html", user=user)


# 编辑用户接口
@app.route('/edit/user', methods=['post'])
def edit_user():
    form = request.form.to_dict()
    result = user_service.edit_user(form)
    return result.get()


# 单个删除用户接口
@app.route('/del/user/<int:id>', methods=['post'])
def del_user(id):
    result = user_service.del_user(id)
    return result.get()


# 批量删除用户接口
@app.route('/del/user', methods=['post'])
def del_user_list():
    ids = request.args.get('ids')
    result = user_service.del_user_list(ids)
    return result.get()


# 用户数据分页
@app.route('/list/user', methods=['get'])
def user_list():
    page = request.args.get('page')
    limit = request.args.get('limit')
    where = request.args.get('searchParams')
    result = user_service.select_user_list(page, limit, where)
    return result.get()


# ----------------------------------------------用户相关模块结束----------------------------------------------


# ----------------------------------------------公告相关模块开始----------------------------------------------
# 公告添加页面
@app.route('/page/notice/add', methods=['get'])
def page_notice_add():
    return render_template("page/notice/add.html")


@app.route('/add/notice', methods=['post'])
def add_notice():
    form = request.form.to_dict()
    result = notice_service.insert_notice(form)
    return result.get()


# 数据公告编辑页面
@app.route('/page/notice/edit', methods=['get'])
def page_notice_edit():
    id = request.args.get('id')
    notice = notice_service.get_notice(id)
    return render_template("page/notice/edit.html", notice=notice)


# 编辑公告接口
@app.route('/edit/notice', methods=['post'])
def edit_notice():
    form = request.form.to_dict()
    result = notice_service.edit_notice(form)
    return result.get()


# 单个删除公告接口
@app.route('/del/notice/<int:id>', methods=['post'])
def del_notice(id):
    result = notice_service.del_notice(id)
    return result.get()


# 批量删除公告接口
@app.route('/del/notice', methods=['post'])
def del_notice_list():
    ids = request.args.get('ids')
    result = notice_service.del_notice_list(ids)
    return result.get()


# 公告数据分页
@app.route('/list/notice', methods=['get'])
def notice_list():
    page = request.args.get('page')
    limit = request.args.get('limit')
    where = request.args.get('searchParams')
    result = notice_service.select_notice_list(page, limit, where)
    return result.get()


# 公告数据最新获取
@app.route('/get/notice/new', methods=['get'])
def get_new_notice():
    result = notice_service.get_notice_by_new()
    return result.get()


# ----------------------------------------------公告相关模块结束----------------------------------------------
# ----------------------------------------------订单相关模块开始----------------------------------------------
# 订单添加页面
@app.route('/page/order/add', methods=['get'])
def page_order_add():
    goods = goods_service.get_goods_list()
    categorys = category_service.get_category_list()
    return render_template("page/order/add.html", goods=goods, categorys=categorys)


# 订单添加接口
@app.route('/add/order', methods=['post'])
def add_order():
    form = request.form.to_dict()
    result = order_service.insert_order(form)
    return result.get()


# 订单编辑页面
@app.route('/page/order/edit', methods=['get'])
def page_order_edit():
    id = request.args.get('id')
    order = order_service.get_order(id)
    goods = goods_service.get_goods_list()
    categorys = category_service.get_category_list()
    return render_template("page/order/edit.html", order=order, goods=goods, categorys=categorys)


# 编辑订单接口
@app.route('/edit/order', methods=['post'])
def edit_order():
    form = request.form.to_dict()
    result = order_service.edit_order(form)
    return result.get()


# 单个删除订单接口
@app.route('/del/order/<int:id>', methods=['post'])
def del_order(id):
    result = order_service.del_order(id)
    return result.get()


# 批量删除订单接口
@app.route('/del/order', methods=['post'])
def del_order_list():
    ids = request.args.get('ids')
    result = order_service.del_order_list(ids)
    return result.get()


# 订单数据分页
@app.route('/list/order', methods=['get'])
def shop_list():
    page = request.args.get('page')
    limit = request.args.get('limit')
    where = request.args.get('searchParams')
    result = order_service.select_order_list(page, limit, where)
    return result.get()


# ----------------------------------------------订单相关模块结束----------------------------------------------


# ----------------------------------------------商品相关模块开始----------------------------------------------
# 商品添加页面
@app.route('/page/goods/add', methods=['get'])
def page_goods_add():
    return render_template("page/goods/add.html")


# 商品添加接口
@app.route('/add/goods', methods=['post'])
def add_goods():
    form = request.form.to_dict()
    result = goods_service.insert_goods(form)
    return result.get()


# 商品编辑页面
@app.route('/page/goods/edit', methods=['get'])
def page_goods_edit():
    id = request.args.get('id')
    goods = goods_service.get_goods(id)
    return render_template("page/goods/edit.html", goods=goods)


# 编辑商品接口
@app.route('/edit/goods', methods=['post'])
def edit_goods():
    form = request.form.to_dict()
    result = goods_service.edit_goods(form)
    return result.get()


# 单个删除商品接口
@app.route('/del/goods/<int:id>', methods=['post'])
def del_goods(id):
    result = goods_service.del_goods(id)
    return result.get()


# 批量删除商品接口
@app.route('/del/goods', methods=['post'])
def del_goods_list():
    ids = request.args.get('ids')
    result = goods_service.del_goods_list(ids)
    return result.get()


# 商品数据分页
@app.route('/list/goods', methods=['get'])
def goods_list():
    page = request.args.get('page')
    limit = request.args.get('limit')
    where = request.args.get('searchParams')
    result = goods_service.select_goods_list(page, limit, where)
    return result.get()


# ----------------------------------------------商品相关模块结束----------------------------------------------

# ----------------------------------------------商品类别相关模块开始----------------------------------------------
# 商品类别添加页面
@app.route('/page/category/add', methods=['get'])
def page_category_add():
    return render_template("page/category/add.html")


# 商品类别添加接口
@app.route('/add/category', methods=['post'])
def add_category():
    form = request.form.to_dict()
    result = category_service.insert_category(form)
    return result.get()


# 商品类别编辑页面
@app.route('/page/category/edit', methods=['get'])
def page_category_edit():
    id = request.args.get('id')
    category = category_service.get_category(id)
    return render_template("page/category/edit.html", category=category)


# 编辑商品类别接口
@app.route('/edit/category', methods=['post'])
def edit_category():
    form = request.form.to_dict()
    result = category_service.edit_category(form)
    return result.get()


# 单个删除商品类别接口
@app.route('/del/category/<int:id>', methods=['post'])
def del_category(id):
    result = category_service.del_category(id)
    return result.get()


# 批量删除商品类别接口
@app.route('/del/category', methods=['post'])
def del_category_list():
    ids = request.args.get('ids')
    result = category_service.del_category_list(ids)
    return result.get()


# 商品类别数据分页
@app.route('/list/category', methods=['get'])
def category_list():
    page = request.args.get('page')
    limit = request.args.get('limit')
    where = request.args.get('searchParams')
    result = category_service.select_category_list(page, limit, where)
    return result.get()


# ----------------------------------------------商品类别相关模块结束----------------------------------------------

# ----------------------------------------------首页相关模块开始----------------------------------------------


# ----------------------------------------------首页相关模块结束----------------------------------------------

if __name__ == '__main__':
    # 端口号设置
    app.run(host="127.0.0.1", port=9000)


  • 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
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426
  • 427
  • 428
  • 429
  • 430
  • 431
  • 432
  • 433
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439

源码获取:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/198734
推荐阅读
相关标签