Desarrollo de servidor de aplicaciones Ledger

Desarrollo de aplicaciones Ledger

estudia mucho, mejora cada día

Este artículo se ha incluido en mi almacén de Github DayDayUP: github.com/RobodLee/DayDayUP, bienvenido a Star, para obtener más artículos, vaya a: Navegación de directorios

En el último artículo, hablamos sobre el desarrollo del cliente de la aplicación de contabilidad, este artículo hablará sobre el desarrollo del lado del servidor. Hay dos funciones principales del servidor. Una es guardar los datos del cliente en la base de datos. La base de datos que elegí es MySQL; la otra es consultar todos los registros del usuario especificado de la base de datos y enviarlos de vuelta al cliente. Este artículo habla principalmente sobre estas dos funciones. No hablaré sobre las funciones de registro e inicio de sesión de usuario. Son relativamente simples. Puede consultar mi código fuente y hacer clic para ver

1. Construcción ambiental

Todo el proyecto se basa en SpringBoot, por lo que la configuración es relativamente simple, no diré mucho. Permítanme hablar primero sobre el diseño de las tablas de mi base de datos. Hay dos tablas en total, una es la tabla de usuario para almacenar información de usuario y la otra es la tabla de registro para almacenar todos los registros.

ficha de datos

Elegí MyBatis como el marco de la capa de persistencia, por lo que necesito agregar las dependencias requeridas por MyBatis en pom.xml. Hay tres relacionados con la interacción de la base de datos. Uno es la dependencia inicial de MyBatis, el otro es el controlador de conexión de MySQL y el último es el mapeo del tipo de campo de la base de datos MyBatis. Si no hay un tercero, se informará un error al almacenar la fecha.

    <dependencies>

        …………

        <!--mybatis起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- MySQL连接驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.5</version>
        </dependency>

        <!-- mybatis数据库字段类型映射 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-typehandlers-jsr310</artifactId>
            <version>1.0.1</version>
        </dependency>

        …………

    </dependencies>

Echemos un vistazo a la realización de la función cuando se realiza la preparación.

2. Realización de funciones

1. Implementación de la función de carga

1.1 Capa de controlador

    @RequestMapping("/uploadRecords")
    public ResultInfo<String> uploadRecords(String phoneNumber , String recordsJson) {
    
    
        ResultInfo<String> resultInfo = null;
        List<Record> records = JSONArray.parseArray(recordsJson , Record.class);
        try {
    
    
            resultInfo = recordService.uploadRecords(phoneNumber,records);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            resultInfo = new ResultInfo<>();
            resultInfo.setFlag(false);
            resultInfo.setErrorMsg("内部错误");
        }
        return resultInfo;
    }

La capa de control recibe dos parámetros, uno es phoneNumber, que se usa para determinar los datos pasados ​​por el usuario, y el otro es la cadena json de List. Al cargar en el cliente, convertí List a json, por lo que primero necesito convertir Json a List nuevamente, y luego llamar al método recordService.uploadRecords para pasar la List.

1.2 Capa de servicio

    @Override
    public ResultInfo<String> uploadRecords(String phoneNumber, List<Record> records) throws Exception {
    
    
        for (Record record : records) {
    
    
            int status = record.getStatus();
            if (status == 1) {
    
      //添加数据
                System.out.println(record.toString());
                recordMapper.addRecord(phoneNumber, record);
            } else if (status == 2) {
    
       //删除数据
                recordMapper.deleteRecord(record.getUuid());
            } else if (status == 3) {
    
       //修改数据
                recordMapper.upgradeRecord(record);
            }
        }
        //如果在上面代码中出现了异常下面的代码就不会执行,直接将异常抛给Controller层处理
        ResultInfo<String> resultInfo = new ResultInfo<>();
        resultInfo.setFlag(true);
        resultInfo.setData("同步成功");
        return resultInfo;
    }

En la capa de Servicio, recorra la Lista pasada, seleccione la operación apropiada según el valor del estado, ya sea para agregar, eliminar o modificar datos, y luego llame al método correspondiente de la capa dao. Echemos un vistazo a lo que hace la capa de Dao.

1.3 capas de Dao

    /**
     * 添加一条记录
     * @param phoneNumber
     * @param record
     * @throws  Exception
     */
    @Insert("insert into record(id,phoneNumber,category,content,money,status,date) " +
            "values (#{record.uuid},#{phoneNumber},#{record.category},#{record.content},#{record.money},0,#{record.date})")
    void addRecord(@Param("phoneNumber") String phoneNumber,@Param("record") Record record) throws Exception;

    /**
     * 删除指定的记录
     * @param recordId
     * @throws Exception
     */
    @Delete("DELETE FROM record WHERE id = #{recordId}")
    void deleteRecord(@Param("recordId")String recordId) throws Exception;

    /**
     * 修改服务器中的记录
     * @param record
     * @throws Exception
     */
    @Update("UPDATE record SET category=#{category},content=#{content},money=#{money},status=#{status},date=#{dateString} WHERE id = #{uuid}")
    void upgradeRecord(Record record) throws Exception;

Es muy simple, podemos agregar, borrar y modificar datos siempre que escribamos la sentencia SQL correspondiente, todas las demás operaciones las realiza MyBatis por nosotros.

Habiendo dicho la realización de la carga de datos, echemos un vistazo a cómo realizar la descarga de datos.

2. Realización de la función de descarga

2.1 Capa de controlador

    @RequestMapping("/downloadRecords")
    public ResultInfo<List<Record>> downloadRecords(String phoneNumber) {
    
    
        ResultInfo<List<Record>> resultInfo = null;
        try {
    
    
            resultInfo = recordService.downloadRecords(phoneNumber);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            resultInfo = new ResultInfo<>();
            resultInfo.setFlag(false);
            resultInfo.setErrorMsg("内部错误");
        }
        return resultInfo;
    }

El código de la capa Controller es muy simple, es decir, recibe un parámetro phoneNumber para determinar qué usuario envió la solicitud y luego llama al método recordService.downloadRecords (phoneNumber) para pasar el phoneNumber, y luego nueve llega a la capa de servicio.

2.2 Capa de servicio

    @Override
    public ResultInfo<List<Record>> downloadRecords(String phoneNumber) throws Exception {
    
    
        List<Record> records = recordMapper.findAllByPhoneNumber(phoneNumber);
        //如果在上面代码中出现了异常下面的代码就不会执行,直接将异常抛给Controller层处理
        ResultInfo<List<Record>> resultInfo = new ResultInfo<>();
        resultInfo.setFlag(true);
        resultInfo.setData(records);
        return resultInfo;
    }

También es muy simple en la capa de Servicio, es decir, llamar al método recordMapper.findAllByPhoneNumber (phoneNumber) para obtener la colección List que se consulta.

2.3 capas de Dao

    /**
     * 根据手机号码查询该用户下所有的信息
     * @param phoneNumber
     * @throws Exception
     * @return
     */
    @Select("SELECT * FROM record WHERE phoneNumber = #{phoneNumber}")
    @Results({
    
    
            @Result(property = "uuid",column = "id",id = true),
            @Result(property = "category",column = "category"),
            @Result(property = "content",column = "content"),
            @Result(property = "money",column = "money"),
            @Result(property = "status",column = "status"),
            @Result(property = "date",column = "date")
    })
    List<Record> findAllByPhoneNumber(String phoneNumber) throws Exception;

El campo id del registro en la base de datos corresponde al atributo uuid en la clase Record. ¿Por qué el id corresponde directamente al id? La razón por la que dije en el último artículo es que la identificación del SQLite del cliente solo puede ser de tipo int, por lo que se agrega un atributo uuid.

para resumir

El lado del servidor no tiene funciones complicadas, solo un simple CRUD.Creo que puedes seguir las ideas de mi artículo para entender mi código.

Cuenta pública de WeChat

Supongo que te gusta

Origin blog.csdn.net/weixin_43461520/article/details/105476416
Recomendado
Clasificación