嗖嗖移动业务大厅:深度解析后端架构与实现

引言

在通信服务领域,嗖嗖移动业务大厅以其卓越的后端架构和控制台交互设计,为用户提供了一种全新的服务体验。本文将深入探讨嗖嗖移动业务大厅的后端实现,从架构设计到具体业务逻辑,再到安全性和未来展望。

一、后端架构深度解析

嗖嗖移动业务大厅的后端架构采用了经典的三层架构模式:表示层、业务逻辑层和数据访问层。

1、表示层(Console Interface)

表示层是用户与系统交互的接口,目前通过控制台实现。用户通过输入特定的命令来执行操作,系统返回相应的结果。

命令解析:系统能够解析用户输入的命令,并将其映射到相应的业务逻辑。
结果展示:操作结果以文本形式展示在控制台上,用户可以直观地看到操作反馈。

2、业务逻辑层(Business Logic Layer)

业务逻辑层是系统的核心,负责处理具体的业务需求。

用户管理:处理用户的注册、登录、信息修改等业务。
套餐管理:允许管理员配置和更新套餐参数。
服务使用模拟:根据用户套餐和使用行为,模拟扣费并记录消费。
财务管理:管理用户的充值和账单查询。
状态管理:允许管理员对用户电话卡进行冻结和解冻。

3、数据访问层(Data Access Layer)

数据访问层负责与数据库的交互,执行数据的增删改查操作。

数据库设计:采用关系型数据库,设计了用户表、套餐表、消费记录表等。
ORM映射:使用对象关系映射(ORM)技术,简化数据库操作。

 

二、数据库设计详解

数据库是后端系统的重要组成部分,存储了系统的所有数据。以下是部分数据库表:

1、 用户表设计

CREATE TABLE `tb_mobole_card` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `card_number` char(11) COLLATE utf8mb4_bin NOT NULL COMMENT '手机号码',
  `username` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
  `password` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT '密码',
  `ser_package` int(11) NOT NULL COMMENT '所属套餐',
  `money` double(7,2) DEFAULT NULL COMMENT '账户余额',
  `status` int(1) DEFAULT '0' COMMENT '状态:0:正常 1:冻结',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

2、套餐表设计

CREATE TABLE `tb_serpackage` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `talk_time` int(11) DEFAULT NULL COMMENT '通话时长',
  `sms_count` int(11) DEFAULT NULL COMMENT '短信条数',
  `price` double(7,2) DEFAULT NULL COMMENT '套餐月资费',
  `flow` int(11) DEFAULT NULL COMMENT '上网流量',
  `type` int(11) DEFAULT NULL COMMENT '套餐类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

3、消费记录表设计

CREATE TABLE `tb_consuminfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `card_number` char(11) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '手机号码',
  `type` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '消费类型',
  `consum_data` int(11) DEFAULT NULL COMMENT '消费数据',
  `consume_date` datetime DEFAULT NULL COMMENT ' 消费日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

 

三、业务逻辑实现详述

1、 用户注册与登录实现

 /**
     * 1.登录功能
     * @param moboleCard
     */
    @Override
    public boolean login(MoboleCard moboleCard) throws SQLException {
        boolean a = true;
        moboleCards = loRegisterDao.login(moboleCard);
        if (moboleCards.size() > 0) {
            for (MoboleCard moboleCard1 : moboleCards) {
                if (moboleCard1.getStatus() == 0) {
                    System.out.println("登陆成功");
                } else {
                    System.out.println("卡号已禁用");
                    a = false;
                }
            }
        } else {
            System.err.println("温馨提示:卡号或者密码错误,");
            a = false;
        }
        return a;
    }

    /**
     * 2.注册功能
     * @param moboleCard
     * @throws SQLException
     * @throws ParseException
     */
    @Override
    public void register(MoboleCard moboleCard) throws SQLException, ParseException {
        MonthlyConsumptionRecords mrc = new MonthlyConsumptionRecords();
        if (loRegisterDao.register(moboleCard) > 0) {
            mrc.setCard_number(moboleCard.getCardNumber());
            mrc.setReal_SMS_count(0);
            mrc.setReal_talk_time(0);
            mrc.setReal_flow(0);
            mrc.setConsum_amount(0);
            loRegisterDao.addToConsumption(mrc);
            System.out.println("注册成功!卡号: " + moboleCard.getCardNumber() + ",用户名: " + moboleCard.getUsername() + ",当前余额: " + moboleCard.getMoney() + "元");
        } else {
            System.err.println("温馨提示:卡号已存在,请重新输入");
        }
    }

2、套餐参数管理实现

管理员可以更新套餐的各个参数,系统将更新实时反映到数据库中。

//一个往数据库中添加充值记录的示例

@Override
    public int addToRechargeRecord(RechargeRecord record) throws SQLException {
        String sql="insert tb_recharge_record(amount,recharge_date,card_number) values(?,now(),?)";
        return JDBCUtil.executeUpdate(sql,record.getAmount(),record.getCard_number());
    }

//下面是JDBC工具类
private static String url;
    private static String user;
    private static String password;
    private static String driver;

    private static final String dbconfig = "jdbc.properties";
    private static Properties prop = new Properties();
    /**
     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
     */
    static{
        //读取资源文件,获取值。
        try {
            InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(dbconfig);
            prop.load(in);

            //3. 获取数据,赋值
            url = prop.getProperty("url");
            user = prop.getProperty("user");
            password = prop.getProperty("password");
            driver = prop.getProperty("driver");
            //4. 注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {

        return DriverManager.getConnection(url, user, password);
    }


    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn){
        if( rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @param sql    执行的sql语句
     * @param params 可变参数,
     *               可以定义多个参数值,一个方法只能有一个可变参数,必须放参数的最后一个
     *               可以用集合或者数组代替
     * @return
     */
    public static int executeUpdate(String sql, Object... params) throws SQLException {
        Connection connection=null;
        PreparedStatement pStmt = null;
        int count=0;
        try {
            connection=getConnection();
            pStmt=connection.prepareStatement(sql);
            //设置?占位符的参数值
            if (params != null && params.length > 0) {
                for (int i = 0; i < params.length; i++) {
                    pStmt.setObject(i + 1, params[i]);
                }
            }
            count=pStmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally{
            JDBCUtil.close(null, pStmt,connection);
        }
        return count;
    }

    /**
     * 封装执行查询语句功能
     * @param sql sql语句
     * @param clazz 指定类型字节码
     * @param params
     * @param <T> 泛型
     * @return
     */
    public static <T> List<T> executeQuery(String sql, Class<T> clazz, Object...params){
        List<T> list = new ArrayList<>();
        Connection connection = null;
        PreparedStatement pstm = null;
        ResultSet resultSet = null;

        try {
            connection = getConnection();
            pstm = connection.prepareStatement(sql);
            //设置?占位符的参数值   params可变参数当数组使用
            if (params != null && params.length >0){
                for (int i = 0; i < params.length; i++) {
                    pstm.setObject(i+1,params[i]);
                }
            }
            resultSet = pstm.executeQuery();
            //循环获取查询行数据
            while (resultSet.next()) {
                //通过反射根据字节码class获取对象
                T t = clazz.newInstance();
                //通过反射获取此对象中的属性,给属性赋值
                Field[] fields = clazz.getDeclaredFields();
                //遍历实体的属性,封装到模型对象中
                for (Field field : fields) {
                    //暴力反射
                    field.setAccessible(true);

                    //getObject(列下标/列的名称)

                    //根据属性名从结果集行中获取数据保存设置属性的值
                    //模型实体中的属性名必须和表中列名一致
                    //如果列和属性名不一致, select ename empName取别名
                    field.set(t,resultSet.getObject(field.getName()));
                }

                list.add(t);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }finally {
            close(resultSet,pstm,connection);
        }

        return list;
    }

3、电话卡状态管理与套餐修改实现

AdministratorDao ad = new AdministratorDaoImpl();

    @Override
    public boolean loginAdministrator(Administrator administrator) {
        boolean a = false;
        if (ad.selectAdministrator(administrator).size() > 0) {
            System.out.println("登录成功");
            a = true;
        } else {
            System.err.println("账号或者密码不正确,请重新输入");
        }
        return a;
    }

    /**
     * 2.管理员(修改套餐方法)
     *
     * @param serPackage
     */
    @Override
    public void updateSerPackage(SerPackage serPackage) throws SQLException {
        ad.updateSerPackage(serPackage);
        System.out.println("已成功修改套餐");
    }

    /**
     * 解冻卡
     *
     * @param state
     * @param cardName
     * @return
     * @throws SQLException
     */
    @Override
    public boolean updateConSumInfo(int state, String cardName) throws SQLException {
        boolean a = true;

        if (ad.selectConSumInfo(cardName) == 0) {
            System.out.println("已处于解冻状态,无法解冻");
            a = false;
        } else {
            ad.updateConSumInfo(state, cardName);
            ad.updateCard(state, cardName);
        }

        return a;
    }

    /**
     * 冻结卡
     *
     * @param state
     * @param cardNumber
     * @return
     * @throws SQLException
     */
    @Override
    public boolean updateCard(int state, String cardNumber) throws SQLException {
        boolean b = true;
        if (ad.selectConSumInfo(cardNumber) == 0) {
            ad.updateConSumInfo(state, cardNumber);
            ad.updateCard(state, cardNumber);
        } else {
            System.out.println("已处于冻结状态,无法再冻结");
            b = false;
        }

        return b;
    }

四、安全性与异常处理

1、安全措施

输入验证:对所有用户输入进行验证,防止SQL注入等攻击。
权限控制:管理员和普通用户有不同的操作权限。

2、异常处理

错误捕获:系统能够捕获并处理运行时异常,提供友好的错误信息。
日志记录:所有异常和关键操作都有日志记录,便于问题追踪。

五、用户体验与界面设计

虽然当前系统主要通过控制台交互,但未来可以扩展到图形用户界面(GUI)或移动应用,提供更丰富的用户体验。

GUI设计展望

直观的操作界面:设计简洁直观的操作界面,方便用户快速上手。
多平台支持:支持WindowsmacOSLinux平台。

移动应用开发

随时随地访问:用户可以通过智能手机随时随地管理自己的通信服务。
推送通知:及时推送账单信息和套餐变更通知。

 Web服务与API

开放API:提供开放的API,允许第三方应用接入。
自动化脚本:支持自动化脚本调用,方便企业用户集成到自己的系统中。

结语

嗖嗖移动业务大厅的后端实现展现了通信服务平台的创新能力和技术深度。从数据库的精心设计到业务逻辑的严密实现,再到安全性的全面考虑,嗖嗖移动业务大厅为用户提供了一个可靠、高效、安全的通信服务管理平台。随着技术的不断发展,我们期待嗖嗖移动业务大厅能够不断进化,带来更多令人激动的新功能和服务。


 

  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值