需求分析:
1、根据用户隐私设置判断用户是否对所有人展示姓名或对满足条件的人员展示真实姓名;
2、如果用户对所有人公开显示真实姓名,则不对姓名做处理;
3、如果用户仅对满足条件的用户显示真实姓名,则对不满足条件的用户姓名做处理;
4、如果用户未进行隐私设置,则需要对真实姓名做处理;
备注:真实姓名处理过程为如果用户性别为男则显示姓名第一个字+先生,如果性别为女则显示姓名第一个字+女士,如果性别未知则用姓名第一个字+*号补全。
编写方法:
1、真实姓名处理方法:
CREATE FUNCTION user_name_format(real_name VARCHAR(500), sex VARCHAR(500))
RETURNS varchar(500)
BEGIN
# 需返回的字符串
DECLARE return_str VARCHAR(500) DEFAULT NULL;
# 真实姓名长度
DECLARE str_len INT DEFAULT 0;
# *号代替时,需要补全的次数=i+1
DECLARE i INT DEFAULT 0;
# 获取真实姓名首个字母
set return_str = substr(real_name, 1, 1);
# 根据传入的性别值处理
if sex = '0' then
set return_str = concat(return_str, '先生');
elseif sex = '1' then
set return_str = concat(return_str, '女士');
else
set str_len = CHAR_LENGTH(str) - 1;
WHILE i < str_len DO
set return_str = CONCAT(return_str,'*');
set i=i+1;
END WHILE;
end if;
RETURN return_str;
END
2、查询设置是否显示真实姓名:
CREATE FUNCTION is_show_real_name(user_id bigint)
RETURNS varchar(500)
BEGIN
DECLARE is_show VARCHAR(500) DEFAULT '0';
select sups.show_real_name into is_show from sys_user sups where sups.user_id = user_id;
RETURN is_show;
END
3、查询满足的身份条件:
CREATE FUNCTION is_friend(user_id bigint,other_user_id bigint)
RETURNS varchar(500)
BEGIN
DECLARE common_ids VARCHAR(500) DEFAULT NULL;
SELECT GROUP_CONCAT(suaa_1.academic_id) INTO common_ids
FROM sys_user_academic_auth suaa_1,
sys_user_academic_auth suaa_2
WHERE suaa_1.user_id = user_id
AND suaa_2.user_id = other_user_id
AND suaa_1.academic_id= suaa_2.academic_id
AND suaa_1.audit_status = '2'
AND suaa_2.audit_status = '2';
RETURN common_ids;
END
4、获取用户的真实姓名
CREATE FUNCTION get_user_real_name(user_id bigint, other_user_id bigint, real_name VARCHAR(500), sex VARCHAR(500))
RETURNS varchar(500)
BEGIN
DECLARE return_str VARCHAR(500) DEFAULT NULL;
# 对所有人显示真实姓名
if is_show_real_name(user_id) = '1' THEN
set return_str = real_name;
# 只对满足条件的用户显示真实姓名
ELSEIF is_show_real_name(user_id) = '2' and is_friend(user_id, other_user_id) is not null THEN
set return_str = real_name;
# 未设置显示真实姓名
ELSE
set return_str = user_name_format(real_name, sex);
end IF;
RETURN return_str;
END
总结:
1、mysql中使用了CHAR_LENGTH(中文)函数来计算中文的长度;
2、mysql中使用if elseif else end if;结构来做条件判断,多个条件用户and/or连接;
3、mysql中使用while 条件 do 事件 end while;循环做数据处理;
4、mysql方法中使用declare 变量名 类型 default 默认值;声明变量;使用set 变量=值来赋值;
5、mysql方法结构为create function 方法名(变量名 变量类型, ...) returns 返回值类型 begin 方法体 return 返回值; end;