EF+MVC+Bootstrap 项目实践 Day9

今天打算把客户管理做完

一、数据准备

多弄几条数据,好练习分页、搜索,要生成以上数据。随机名字、手机、ID(比如UserId只能1、2、4、6及对应的UserName)、Number(两位随机大写英文和3位数字)

1、随机名字。感谢博客园AngelLee2009的一篇文章给我启发,但是略复杂,改进了一下

DECLARE @firstNames VARCHAR(100)='芳海亮红君军俊江河湖波杰山燕阳洋涛斌彬宾微伟威薇刚倩' --保存名的集合
DECLARE @lastNames VARCHAR(100)='刘方王李赵孙钱胡易黄温丁周魏陈曾涂' --保存姓的集合

declare @i int = 1
while(@i <= 10)
begin
    PRINT ( SUBSTRING(@lastNames, ABS(CHECKSUM(NEWID()))%LEN(@lastNames)+1,1) 
        + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1)
        + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1) )
    set @i = @i + 1
END
李宾江
赵刚倩
黄海刚
赵燕微
胡河洋
温斌俊
魏倩海
魏斌微
魏洋亮
易倩倩

 循环内的随机数不能用RAND(),而要用GUID,取模配合SUBSTRING要注意+1

2、随机手机(13开头)

SELECT '13'+RIGHT(1000000000 + CONVERT(BIGINT,ABS(CHECKSUM(NEWID()))), 9)

位数大的话超过了int要注意转成bigint,checksum会产生负数,最好要用ABS(),试了一下本例中不用ABS也是可以的,因为有了一层RIGHT()

一般这种情况重复的可能性非常非常小,位数少还有可能,9位随机数几乎就不可能重复了。

如果在项目中正式使用,为避免重复,可以在要生成的列上设置唯一索引,并把“忽略重复键”设为“是”,这样插入重复键时,会跳过(而不是全部失败)

这里只是生成随机手机号测试,就无所谓了

3、UserId

只能生成1、2、4、6,然后根据ID去取UserName

DECLARE @userId VARCHAR(10) = '1246';
SELECT SUBSTRING(@userId, @random%LEN(@userId)+1,1)

4、其余的类似,但有个Profession有个14,两位数再用上面这种定义'abcd'再SUBSTRING(),就不大好使了

DECLARE @str varchar(50)='1,2,3,5,6,14';
IF(OBJECT_ID('tempdb..#tab') IS NOT NULL) DROP TABLE #tab
CREATE TABLE #tab (code varchar(10))
WHILE CHARINDEX(',',@str)>0
    BEGIN
        INSERT #tab (code) VALUES (LEFT(@str,CHARINDEX(',',@str)-1))
        SET @str=STUFF(@str,1,CHARINDEX(',',@str),'')
    END    
IF(@str<>'') INSERT INTO #tab (code) VALUES (@str)
SELECT TOP 1 code FROM #tab ORDER BY NEWID()

项目中有封装过split方法,那把逗号分隔的变成每行一条路据,就几行,挺好用的。

ORDER BY NEWID()可以随机得到第一行数据

declare @firstNames varchar(100) = '芳海亮红君军俊江河湖波杰山燕阳洋涛斌彬宾微伟威薇刚倩'; --保存名的集合
declare @lastNames varchar(100) = '刘方王李赵孙钱胡易黄温丁周魏陈曾涂'; --保存姓的集合
DECLARE @userId VARCHAR(10) = '1246';
DECLARE @number VARCHAR(50) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE @gender VARCHAR(10) = '12';
DECLARE @email VARCHAR(10) = '1246';
DECLARE @address VARCHAR(10) = '1246';
DECLARE @category VARCHAR(10) = '135';
DECLARE @ageGroup VARCHAR(10) = '23456';
DECLARE @random BIGINT;

/*********两位以上处理比较麻烦***********/
DECLARE @str varchar(50)='1,2,3,5,6,14';
IF(OBJECT_ID('tempdb..#tab') IS NOT NULL) DROP TABLE #tab
CREATE TABLE #tab (code varchar(10))
WHILE CHARINDEX(',',@str)>0
    BEGIN
        INSERT #tab (code) VALUES (LEFT(@str,CHARINDEX(',',@str)-1))
        SET @str=STUFF(@str,1,CHARINDEX(',',@str),'')
    END    
IF(@str<>'') INSERT INTO #tab (code) VALUES (@str)
/**************************************/

DECLARE @index INT=1;
WHILE(@index<=100)
    BEGIN
        SET @random = ABS(CHECKSUM(NEWID()));  --循环里有些随机数可以共用,如果不想共用,要再执行ABS(CHECKSUM(NEWID()))
        INSERT INTO Customer
            ( Name, Tel, UserId,  Username, Number, Gender, Email, [Address],
            Category, Profession, AgeGroup, CreateTime )
        VALUES
            ( ( SUBSTRING(@lastNames, @random%LEN(@lastNames)+1,1) 
            + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1)
            + SUBSTRING(@firstNames, ABS(CHECKSUM(NEWID()))%LEN(@firstNames)+1,1) ),
            ('13'+RIGHT(1000000000 + @random, 9)),
            ( SUBSTRING(@userId, @random%LEN(@userId)+1,1) ),
            (SELECT LoginName FROM GMSAccount.dbo.[User] WHERE ID=SUBSTRING(@userId, @random%LEN(@userId)+1,1)),
            ( SUBSTRING(@number, @random%(LEN(@number)-1)+1,2)+CONVERT(VARCHAR(20),@random%100+100)),
            ( SUBSTRING(@gender, @random%LEN(@gender)+1,1) ),
            ( SUBSTRING(@number, @random%LEN(@number)+1,1) 
            + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1))
            + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1))
            + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1))
            + LOWER(SUBSTRING(@number, ABS(CHECKSUM(NEWID()))%LEN(@number)+1,1))+'@MVC.com' ), 
            '',
            ( SUBSTRING(@category, @random%LEN(@category)+1,1) ),
            (SELECT TOP 1 code FROM #tab ORDER BY NEWID()), 
            ( SUBSTRING(@ageGroup, @random%LEN(@ageGroup)+1,1) ),
            GETDATE() );
        SET @index=@index+1;
    END

SELECT * FROM Customer
--TRUNCATE TABLE Customer

如果有需要,还可以根据全国地名随机生成地址(至少到城市一级),Email中的姓名最好还要有意义的单词,这些改进暂时就不做了,反正是测试数据

最终得到结果,还是不错的,通过这次生成练习,学到了不少生成随机数据的技巧。共享出来,也希望路过的朋友能有收获

有个生成数据脚本,就可以更方便地练习增删改查了。

二、共享页的跳转后相关内容修改

 还发现个问题,点击跳转视图后,还需要把左边菜单展现在当前视图,否则菜单只会展示默认的样子(因为是单纯bootstrap的代码)

研究了一下源码的js判断,是根据点击的href和当前跳转后的地址栏地址进行判断,感觉源码弄的有些复杂,效率也不高,想改进一下。

一晃又到了半夜了,明天再继续吧。。。

原文地址:https://www.cnblogs.com/liuyouying/p/5055954.html