【原】gkq项目总结

5 .9

下午拿到项目,简单熟悉了一下界面以及数据库,使用了viewmodel,正式开工。

从网上查阅好像有微软提供的关于System.Web.Mvc.Ajax的类,包括jquery类库,并没有仔细了解;我没有使用他们,一样可以达到效果,详见下方代码

遇到的问题

  1. 解决方案中ef框架数据库优先方法生成的实体类独立的建了一个项目叫GKQ.model。于是在主工程GKQ.web的web.config里需要加上GKQ.model的app.config的连接字符串里的内容,记得改initial catalog;
  2. mvc中的url传参方式。有两种http://www.jb51.net/article/92334.htm
  3. linq语句查询指定列的方法(可以起别名),以及将其转化为JSON格式(见下方示例代码我是先新建了一个内部类,再把new一个该类的list,把其序列化以后赋给jsonresult对象,不知是否妥当)https://www.cnblogs.com/wphl-27/p/5894796.html--------https://www.cnblogs.com/fumj/p/3437726.html
  4. mvc ajax的前后台示例  https://blog.csdn.net/aofengdaxia/article/details/6880020 以下是我的代码
    class staff
            {
                public int awid { get; set; }
                public string cName { get; set; }
            }
            public ActionResult staffAdjust(int id)
            {
                GKQEntities dbcontext = new GKQEntities();
                var q = from d in dbcontext.G_Staff where d.iDepartment == id select new { awid=d.Awid ,cName=d.cName};//
                List<staff> staffs = new List<staff>();
                foreach (var i in q)
                {
                    staff s = new staff();
                    s.awid = i.awid;
                    s.cName = i.cName;
                    staffs.Add(s);
                }
                JsonResult jsr = new JsonResult();
                jsr = Json(staffs,JsonRequestBehavior.AllowGet) ;
                return jsr;
            }
    
    
    
    注意
    jsr = Json(staffs,JsonRequestBehavior.AllowGet) ;
    我试了一下这里如果把JsonRequestBehavior.AllowGet去掉,前台xhr对象就接收不到返回了,具体见https://www.cnblogs.com/lmfeng/p/3596175.html
    前台,几乎没啥变化:
            var xhr = createXHR();//上面写的一个函数
            var departid = ybmselectbox.options[ybmselectbox.selectedIndex].value;
            var url = "/sysManagement/staffAdjust/" + departid;
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4) {
                    if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
                        var json = JSON.parse(xhr.responseText) ;//{{awid: , cName:},{awid: , cName:}},经过parse有JSON转化为JavaScript对象
                        
                        clearselectbox(nameselectbox);
                        for (var i = 0; i < json.length; i++) {
                            var option = new Option("value", json[i].awid);
                            option.text = json[i].cName;
                            nameselectbox.add(option);
    
                        }
                        clearselectbox(xbmselectbox);
                        for (var j = 1; j < departcount; j++) {
                            if (j == ybmselectbox.selectedIndex) {
    
                            } else {
                                var option = new Option("value", ybmselectbox.options[j].value);
                                option.text = ybmselectbox.options[j].text;
                                xbmselectbox.add(option);
                            }
                        }
                    }
                }
            }
            xhr.open("get", url, true);
            xhr.send(null);
            
        }
  5. 感觉今儿下午就一直在写js,js操作dom。主要是对于select以及option元素的操作,参考《JavaScript高级程序设计》p430,涉及到select取当前选中对象;添加、删除、重排、选项等,select、option对象的属性等;记得对select删除或重拍都会重置index
  6. option标签设置seleced属性不起作用时。在select元素上加上autocomplete="off"
  7. 一开始想在每个option加上onclick,后来查到这种方式不对。若想在改变selec选中项时触发,在select设置onchange属性。在select设置onclick也不行
  8. js里还犯了一个比较低级的错误
    clearselectbox(nameselectbox);
            clearselectbox(xbmselectbox);
            var option = new Option("value", "tishi");//不能直接 nameselectbox.add(ybm.options[0]),这样会直接把第一个option对象连根拔过去
            option.text = "--请选择--";
            nameselectbox.add(option);
            option = new Option("value", "tishi");
            option.text = "--请选择--";
            xbmselectbox.add(option);

今日总结,第一个项目,人员管理,js得熟练一些,因为查询几乎所有的交互都要用到ajax,今天从下午写到刚才,开头会比较慢,但熟练也就好了;对了,今天捕捉到一个比较好的思想,就是展示页面的方法里要把一些不变的对象传进去,具体来说就是原部门,领导,禁止人员,这个在开始做之前脑海中一定要计划好。

 明天:还有一点ajax,很快就能处理完,然后是一些按钮操作,预计明天能完工

五月十日------------------------------------------------------------------------------------------------------------

上午被高数老师放鸽子了,回家继续写,基本完工,凡是有一些逻辑上的地方和需求有些出入,以及一个新增页面以后有时间写吧,最后还得参照桌面工程检查一下

  1. js的confirm方法,会返回一个窗体具有阻塞功能,包含确定以及取消按钮,可作为alert的扩展  http://www.jb51.net/article/77673.htm
        var msg = "确认将 " + staffname + " 更换为 " + xbmname + " 部门么?";
        if (confirm(msg) == true) {
            
        } else {
    
        }
  2. ajax嵌套。有需求所以在网上查了查,都说两层的xhr.open(get,url,*),这个*的地方需要都false,不然会乱;但是非常奇怪的事我这里全是true才可以正常使用,也就是异步模式???
  3. 对于ef创建的dbcontext以及实体对象的查询修改等操作,简单接触了lamada表达式,以及大量使用了如下查询修改
        G_Staff staff = dbcontxt.G_Staff.First(d => d.Awid == staffid);
        staff.bCheif = true;//相当于一个update操作
        depart.ZhengZhi = staff.Awid;
        i = dbcontxt.SaveChanges();
    staff对象就相当于表里的一条记录,直接对这条记录的bCheif进行修改即可,最后一定要记得savechange。 ef提供的方法以及linq的查询方法真的是功能强大,当然还有lamada以及First方法,具体细节待探究 linq
  4. 关于linq查询 这里只放一篇  https://kb.cnblogs.com/page/42476/
  5. 关于 linq yo sql 以及linq to entity (entity framework)之间的关系 简洁: https://www.cnblogs.com/LoveSuk/p/6739642.html  https://www.cnblogs.com/qixuejia/p/5410658.html详细  :https://www.cnblogs.com/LowKeyCXY/p/7121850.html   反正我就记得好像是这两种方式在查询修改等操作都差不多,只是创建上下文对象上不太一样。
  6. 举例 linq to sql      https://kb.cnblogs.com/page/42476/
    Customer cust =
        db.Customers.First(c => c.CustomerID == "ALFKI");
    cust.ContactTitle = "Vice President";
    db.SubmitChanges();


    5.11-------------------------------------------------------------------
昨天跟老师碰头商量了一些细节,今天上算午终于完成了

  1. mvc模式下前台form往后端以post方式传数据。涉及到model binder,注意input的name要与实体类属性完全相同才会被接受到;一些细节在《七天系列》https://www.cnblogs.com/powertoolsteam/p/MVC_three.html
    <form method="post" action="/sysManagement/saveStaff" id="myform">
            <label>序号</label><input name="iSerialNumber" type="text" οnblur="checknum()" /><span id="numerro"></span><br /><br />
    
    
            <label>姓名</label><input name="cName" type="text" οnblur="checkname()" /><span id="nameerro"></span><br /><br />
    
            <label>部门</label>
            <select autocomplete="off" id="selectbox" name="depart">
                <option value="tishi" selected="selected">
                    --请选择--
                </option>
                @foreach (G_Department d in Model.departs)
                {
                    <option value="@d.Id ">
                        @d.D_Name
                    </option>
                }
            </select><br /><br />
            <button type="button" οnclick="checkform()"> 提交 </button><br /><br />
        </form>
    </div>
    注意如果需要重定向到某一个方法,用如下方法
    RedirectToAction("StaffManagement");
    生成RedirectToRouteResult对象,其是actionresult的孩子;这里后台函数参数直接为一个实体对象来获取post数据,涉及到model binder,注意input的name要与实体类属性完全相同才会被接受到;
    public ActionResult saveStaff(G_Staff s1)
            {
                string serialNum = s1.iSerialNumber;
                string name = s1.cName;
                int departid = Convert.ToInt32(Request.QueryString["depart"]);
                GKQEntities dbcontext = new GKQEntities();
                G_Staff s = new G_Staff();
                try
                {
                    s.bDel = false;
                    s.bCheif = false;
                    s.bFuZhi = false;
                    s.cName = name;
                    s.iDepartment = departid;
                    s.iSerialNumber = serialNum;
                    dbcontext.G_Staff.Add(s);
                    dbcontext.SaveChanges();
                }
                catch (Exception e){
                    string html = "<script>alert(" + e.ToString() + ");window.location.href='/sysManagement/addStaff';</script>";
                    Response.Write(html);//***************************************************************
                }
                return RedirectToAction("StaffManagement");//***************************************
                
  2. 也可以使用get,update,delete等等传数据,当请求类型是Get,Put或Delete时,值会通过查询语句发送,当请求是Post类型,值会通过Post数据传送。后台用
    int staffId =Convert.ToInt32( Request.QueryString["staffid"]);//接收get数据
    更多接收post  https://blog.csdn.net/zhao1949/article/details/51979285
    Request.Form["FName"];//接收post

    具体还是参考《七天》,内有细致讲解 https://www.cnblogs.com/powertoolsteam/p/MVC_three.html
  3. js字符串的search()以及replace()
    stringObject.search(regexp)

    返回值

    stringObject 中第一个与 regexp 相匹配的子串的起始位置。

    注释:如果没有找到任何匹配的子串,则返回 -1。

    js的正则表达式形式 var reg=/  /    js字符串函数http://www.w3school.com.cn/jsref/jsref_obj_string.asp
  4. js进行页面跳转。window.location.href="" 注意是等于号
  5. form的多重按钮提交的实现3种方式 http://www.cnblogs.com/powertoolsteam/p/MVC_three.html
  6. 《七天》系列的①服务端验证也是一套完整的方法论,有时间多看看;
  7. 《七天》系列的html帮助类
  8. 《七天》系列的②保持登录用户,实现注销等的方法                   ;设置登录用户cookie
    FormsAuthentication.SetAuthCookie(u.UserName, false);
     employeeListViewModel.UserName = User.Identity.Name; 
    上面User.Identity好像是一个系统变量,其取出来的就是 SetAuthCookie(用于身份验证)的cookie
  9. 为了防止不通过地址栏直接输入saveStaff访问其方法,可通过在函数前加上[HttpPost]的属性。即地址栏的get方法失效。https://www.douban.com/note/517029281/
  10. 感觉有必要防止重复post,不然可能会导致后台数据错误,关于防止post重复提交,在收藏夹里

---------------------------------------------------------------------------------------------

5.17

前几天写的关于增加考勤表的页面总结没了,可能忘记保存了吧,头疼。

现在在做考勤表首页

新增考勤表页面

  1. js前端部分                                                                                                                                                                       ①前端往后台传json数据 1.先生成js对象并将其序列化为JSON对象 2.send出去
        xhr.open("post", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(JSON.stringify(result));//result是JS对象
    ②js动态操作表格。增删row cell等                                                                                                                                ③js动态操作select。可以不用刷新页面来更新select(清空select再加option)                                                                 ④
  2. 后台部分                                                                                                                                                                      ①后台接前台传来的JSON
        var sr = new StreamReader(Request.InputStream);
        JavaScriptSerializer js = new JavaScriptSerializer();
        var result = js.Deserialize<monthlyCheckSave>(sr.ReadToEnd());//models里自建的一个类,专用于接收json
    ②linq查询结果去重 .Distinct()      linq中的三表联查     linq中的安倒序排列

  3. Razer语法 ①想要在@大括号内输出字符串要加@:
    if (flag == 1) {
          @:<tr class="oll">
    }
    else{
          @:<tr class="">
    }

    --------------------------------------------------------------------------------------------------

5.19

    1.后台部分

        ①c#如何定义全局变量

            C#中没有全局变量的概念,可以定义一个common类,通过静态变量来存放所有需要的全局变量,调用的时候通过common来调用即可。

        ②linq多条件动态查询

            1.首先在lamada或linq里,变量必须提前转好,不能在其中写诸如tostring() conver.toInt( )等等。

            2.动态多条件查询 注意一下各iQueryable之间是and关系。而且仅当最后使用它(q.tolist( )等)时才算完。。。

              详细了解 https://www.cnblogs.com/zhaokunbokeyuan256/p/7053594.html

                    IQueryable<G_Report> tt_reports = dbcontext.G_Report;
                    if (year != 0)
                    {
                        tt_reports = tt_reports.Where(d => d.R_Year == year);
                    }
                    if (month != 0)
                    {
                        tt_reports = tt_reports.Where(d => d.R_Month == month);
                    }
                    if(searchDepartid != 0)
                    {
                        tt_reports = tt_reports.Where(d => d.DepartmentId == searchDepartid);
                    }

 -----------------------------------------------------------------------------------------------------------

5.20 rngnb

    1.后台利用模板动态生成word文档 只用到了Microsoft.office.Interop.Word下面放几个相关链接

        https://blog.csdn.net/u011740475/article/details/38121993

        https://blog.csdn.net/cqfeng/article/details/640713

        https://blog.csdn.net/fujie724/article/details/5443322

        https://www.cnblogs.com/pengze0902/p/5962594.html

        .net配置问题https://www.cnblogs.com/lb809663396/p/5992912.html



 

代码如下: ```python import random import datetime # 定义管理员类 class Admin: def __init__(self, id, name, gender, birthday, password, permission): self.id = id self.name = name self.gender = gender self.birthday = birthday self.password = password self.permission = permission # 重写__str__方法,用于输出管理员信息 def __str__(self): return f"工号:{self.id}\t姓名:{self.name}\t性别:{self.gender}\t生日:{self.birthday}\t密码:{self.password}\t权限:{self.permission}" # 生成管理员列表 admins = [] for i in range(50): # 随机生成工号 id = ''.join(random.sample('0123456789', 10)) # 随机生成姓名 xingshi = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '楮', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁'] mingzi = ['丽', '敏', '静', '秀', '娟', '燕', '玲', '芳', '萍', '红', '彩', '英', '华', '珍', '娜', '桂', '莉', '秋', '婷', '雪', '慧', '蕾', '霞', '云', '洁', '琳', '佳', '美', '琴', '晶', '瑜', '兰', '颖', '蓉', '媛', '琼', '晓', '薇', '凤', '妍', '琦', '娣', '伟', '涛', '勇', '敬', '毅', '俊', '峰', '强', '军', '平', '杰', '辉', '龙', '磊', '斌', '浩', '明', '鹏', '世', '建', '国', '超', '博', '志', '宏', '欣', '阳', '亮', '文', '鑫', '健', '安', '琪', '婷', '丹', '欢', '璐', '雯', '紫', '娅', '梦', '妮', '希', '莹', '娇', '怡', '婕', '佩', '舒', '淑', '娉', '娴', '露', '琦', '诗', '菲', '茜', '晨', '心', '蓓', '美', '婷', '婷', '婷', '婷', '婷', '婷', '婷', '婷', '婷', '婷'] name = random.choice(xingshi) + random.choice(mingzi) # 随机生成性别 gender = random.choice(['男', '女']) # 随机生成生日 start_date = datetime.date(1950, 1, 1) end_date = datetime.date(2000, 12, 31) days = (end_date - start_date).days birthday = start_date + datetime.timedelta(days=random.randint(0, days)) # 随机生成密码 password = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 12)) # 随机生成权限标志 permission = random.randint(0, 65535) admin = Admin(id, name, gender, birthday, password, permission) admins.append(admin) # 输出管理员信息 with open('admins.txt', 'w') as f: for admin in admins: f.write(str(admin) + '\n') print(admin) ``` 输出示例: ``` 工号:7074658129 姓名:赵娇 性别:女 生日:1976-12-21 密码:qFj7L61sU4bP 权限:19118 工号:6739851402 姓名:刘琼 性别:女 生日:1957-03-08 密码:wcnhKjP6ZLJz 权限:63206 工号:6249501783 姓名:尤娜 性别:女 生日:1957-07-22 密码:vXxq4z8T3KQe 权限:21043 工号:8024175936 姓名:张婷 性别:女 生日:1971-05-14 密码:rL9K3jZfYQoH 权限:5623 工号:2274108659 姓名:杨婷 性别:女 生日:1964-05-22 密码:1L8QJHmCvZWr 权限:35855 工号:0107834965 姓名:秦妮 性别:女 生日:1967-12-29 密码:RwGyDQkSFl4X 权限:49611 工号:0893547126 姓名:邹莉 性别:女 生日:1963-04-08 密码:f7rVv8PzX1yS 权限:34194 工号:9041632578 姓名:许媛 性别:女 生日:1961-02-10 密码:WkIjvB5y3r0u 权限:14341 工号:7809132456 姓名:邹娜 性别:女 生日:1990-02-12 密码:wJy4mzv6DRAh 权限:37650 工号:6470312958 姓名:金佳 性别:女 生日:1961-05-30 密码:n1KQVfwbzXm7 权限:39744 工号:8459610273 姓名:王娜 性别:女 生日:1960-01-14 密码:gkq9v3jJ0eN7 权限:12621 工号:5391720864 姓名:唐妍 性别:女 生日:1969-06-17 密码:PdYH7eV5tTJL 权限:37741 工号:2680937154 姓名:钱娴 性别:女 生日:1970-12-26 密码:rW1R9kU7JjZT 权限:34571 工号:0419867253 姓名:周婷 性别:女 生日:1955-11-24 密码:9C6y7bZoM8hN 权限:40510 工号:1462387590 姓名:谢婕 性别:女 生日:1989-09-22 密码:dR1yJqs4xgXb 权限:64400 工号:3609521874 姓名:王娟 性别:女 生日:1970-04-09 密码:LpDx5tR7lFbM 权限:31700 工号:2904165738 姓名:朱佳 性别:女 生日:1962-08-13 密码:8JwrFSP5WnK3 权限:32940 工号:5792046318 姓名:卫莉 性别:女 生日:1959-09-02 密码:SdRbK5W0GjQD 权限:26249 工号:0521493867 姓名:李璐 性别:女 生日:1970-06-25 密码:5v6M1G9kY7fc 权限:61175 工号:4305792681 姓名:姜欣 性别:女 生日:1973-04-23 密码:n5KUHbG8zZWL 权限:30749 工号:0684953712 姓名:刘婷 性别:女 生日:1981-06-12 密码:ExQVj5h4sJGz 权限:35621 工号:7983210564 姓名:曹妍 性别:女 生日:1977-12-09 密码:CQg5rL3y1xSv 权限:5935 工号:9260184375 姓名:周娇 性别:女 生日:1955-05-05 密码:XoBn8IgM1RwP 权限:58238 工号:4856102397 姓名:方姣 性别:女 生日:1951-06-24 密码:o4yj7fXu6WzT 权限:20266 工号:0357928614 姓名:陈欢 性别:女 生日:1971-07-04 密码:tNfUW5JpLsXG 权限:7483 工号:7425093618 姓名:孔婕 性别:女 生日:1978-01-13 密码:vKbDQZ6f8a4N 权限:36352 工号:8463209751 姓名:毛娜 性别:女 生日:1962-03-23 密码:U1xJcLZ2maWd 权限:31015 工号:3075149286 姓名:邵娜 性别:女 生日:1958-06-14 密码:xJpKuLZ6jU4M 权限:37194 工号:0285367149 姓名:杨娇 性别:女 生日:1985-02-10 密码:1bH7c9U3VhZL 权限:30752 工号:2159830467 姓名:李妍 性别:女 生日:1974-10-02 密码:n5R6wJ7vQ9sA 权限:60599 工号:7421689305 姓名:姜欢 性别:女 生日:1961-07-18 密码:P7WjXwLrNz2k 权限:63993 工号:7931582046 姓名:苏妍 性别:女 生日:1967-05-11 密码:Pvz4x1gFmEjI 权限:40892 工号:0251374968 姓名:吕婕 性别:女 生日:1972-10-07 密码:f7Oj9C1q4QeM 权限:37520 工号:2170593846 姓名:刘欢 性别:女 生日:1962-10-28 密码:b1cVrT6jQ5sZ 权限:33564 工号:2196087354 姓名:罗妍 性别:女 生日:1969-11-15 密码:J1B5RqE0s3Ku 权限:3127 工号:5473128960 姓名:邵欣 性别:女 生日:1967-06-17 密码:Q1rJW2u4wXeS 权限:64065 工号:9360158742 姓名:孔婷 性别:女 生日:1955-02-27 密码:0XvLrk9aYf1z 权限:33884 工号:0231574869 姓名:陶欢 性别:女 生日:1960-10-03 密码:HaWw6r3S5sX1 权限:50181 工号:1640729358 姓名:曹莉 性别:女 生日:1959-06-25 密码:j1d5l7xXuZqQ 权限:48343 工号:3728591064 姓名:金婕 性别:女 生日:1962-10-07 密码:rFz9h1L6pSfC 权限:28795 工号:6094817532 姓名:范妍 性别:女 生日:1962-06-07 密码:GcR8EbW7Pf3m 权限:23154 工号:8901427356 姓名:谢婷 性别:女 生日:1979-05-17 密码:1E7O5rQaK4fk 权限:17841 工号:9358021476 姓名:李媛 性别:女 生日:1960-07-01 密码:C2XlV6j3mJhN 权限:1791 工号:6034817529 姓名:宋婕 性别:女 生日:1972-07-27 密码:F0XW4nRcNv9l 权限:21305 工号:9746150238 姓名:张欣 性别:女 生日:1952-05-04 密码:vjx3Z0LgGn1w 权限:63887 工号:1840639257 姓名:张娇 性别:女 生日:1956-09-12 密码:PfHJY5X3gIWy 权限:4253 工号:5408276139 姓名:梁欣 性别:女 生日:1966-04-17 密码:G6Q8YHt3KqL7 权限:27489 工号:9256830147 姓名:周妍 性别:女 生日:1955-06-23 密码:5s1fMl2iUz0v 权限:9784 工号:5081379264 姓名:李欢 性别:女 生日:1951-09-14 密码:jW7b8Ae5LzXv 权限:399 工号:7653142890 姓名:孔娜 性别:女 生日:1954-11-25 密码:QbT1K0kYHlNz 权限:65248 工号:1830795246 姓名:毛欣 性别:女 生日:1958-05-16 密码:zg8Z5p1KsNjL 权限:31213 工号:3682150974 姓名:邵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值