同福

做个用户管理系统(14)——用户模块user之个人资料修改功能的实现【20201130】

介绍

介绍

福哥今天带着大家完成个人资料修改的功能。这个个人资料修改里面包括很多项目,包括昵称、性别、生日、学历、个人介绍几个项目。其中性别是一组单选项,而生日是两组下拉框,学历是一组下拉框,个人介绍是一个多行文本框,看起来个人资料表单包含了大部分表单元素内容了。

这个表单里有个难点,就是要保存性别和学历的时候,表单里面是一个单词,而数据库里面是tinyint(微整型)类型,要知道字符串是无法存入整型字段里面的。

字典库

我们需要建立一个字典库对象,用来设置各种ID和标签对照表关系数据,字典库对象文件存放在WEB-INF\Classes\Dictionary.inc.php里面。

918a2790b68c2465.jpg

代码

class Dictionary{
    public static $genderArr = array(
        "male"=>"男士",
        "female"=>"女士",
    );

    public static $eduArr = array(
        "hs"=>"中学",
        "ts"=>"中专/技校",
        "cg"=>"大学专科",
        "ug"=>"大学专科",
        "md"=>"硕士",
        "dc"=>"博士",
    );

    public static function getArrId(array $arr, string $code):int {
        $j = 1;
        foreach($arr as $myCode => $myLabel){
            if($code == $myCode){

                return $j;
            }
            $j ++;
        }

        return 0;
    }

    public static function getArrCode(array $arr, int $id):string {
        $j = 1;
        foreach($arr as $myCode => $myLabel){
            if($id == $j){

                return $myCode;
            }
            $j ++;
        }

        return null;
    }
}

个人资料修改

代码

/**
 * note:
 *   1 - user is not exists
 *   2 - exception
 *
 * @param int $userID
 * @param string $nickName
 * @param int $gender
 * @param string $birth
 * @param string $edu
 * @param string $descript
 * @return int
 */
public function setProfile(int $userID, string $nickName, int $gender, string $birth, string $edu, string $descript):int {
    $tfdo = $this->tfphp->getDatabase()->getTFDO();
    $userInfo = $tfdo->fetchOne("select * from user where userID = @int", $userID);
    if($userInfo == null){

        return 1;
    }

    $profileInfo = $tfdo->fetchOne("select * from user_profile where userID = @int", $userID);
    if($profileInfo == null){
        $ret = $tfdo->insert("user_profile", array(
            'userID'=>$userID,
        ), array(
            'userID'=>"int",
        ));
        if(!$ret){

            return 2;
        }
    }

    $ret = $tfdo->update("user_profile", array(
        'nickName'=>$nickName,
        'gender'=>$gender,
        'birth'=>$birth,
        'topEdu'=>Dictionary::getArrId(Dictionary::$eduArr, $edu),
        'descript'=>$descript,
    ), array(
        'gender'=>"int",
        'topEdu'=>"int",
    ), "userID = @int", $userID);
    if(!$ret){

        return 2;
    }

    return 0;
}

讲解

字典库

我们这个字典库对象福哥只放了两个数组,一个是性别,一个是学历,这些数组作为字典库的静态属性存在,静态属性方便我们直接调用而无需进行初始化操作。

getArrId

这个方法用来通过字典库数组的code找到对应的id,因为数组本身没有保存id,所以通过foreach循环递加一个变量作为id。

getArrCoce

这个方法用来提供字典库数组的id找到对应的code,同样的需要通过foreach循环递加得到id再返回对应的code。

个人资料修改

首先检查用户$userID是否存在,不存在就报错。

接着我们尝试去查询$userID对应的user_profile记录,如果不存在就插入一条空的记录,因为user_profile表除了userID字段之外其他字段都可用是NULL的,所以不用担心会报错。

最好我们根据传入的参数对$userID对应的user_profile记录写入数据。

总结

福哥今天带着大家完成了个人资料修改的功能。这个个人资料功能提交的项目比较多,最关键的是部分项目的数据是字符串的,需要我们转换成整型数字,所以福哥创建了字典库Dictionary对象,通过这个字典库对象完成数组的code和id之间的互相转换操作。

目前为止福哥已经带着童鞋们完成了所有表单的处理程序用到的用友模块user的业务方法,从下一课开始福哥要开始带着大家制作页面控制器了。

页面控制器使用PageController扩展而来,表单处理程序则使用APIController扩展而来,每个PageController控制器对应一个视图模板,童鞋们不要弄迷惑了。