c5_labsci/web/admin/rigger/admin.go

635 lines
18 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package rigger
import (
"ciyon/web/admin"
c "ciyon/zciyon"
"ciyon/zciyon/xlsx"
"fmt"
"math/rand"
"net/http"
"strings"
)
func admin_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
query := post.Getobj("query")
csql := c.NewCiySQL("zc_admin")
csql.Where("departid", post.Get("departid"))
liid := c.Getint(query, "liid")
if liid > 0 {
csql.Where("stpstatus", liid)
}
csql.Where("name like", c.Getstr(query, "name"))
csql.Where("mobile like", c.Getstr(query, "mobile"))
csql.Where("sex", c.Getstr(query, "sex"))
csql.Where_daterange("logintimes", c.Getstr(query, "logintimes"))
csql.Where_daterange("addtimes", c.Getstr(query, "addtimes"))
order := post.Get("order", "id desc")
csql.Order(order)
query["order"] = order
return query, csql
}
func Admin_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
where, csql := admin_setwhere(post)
pageno := post.Getint("pageno", 1)
pagecount := post.Getint("pagecount", 10)
csql.Limit(pageno, pagecount)
rows, mainrowcount, err := c.CiyDB.Get(csql, post.Getint("count"))
if err != nil {
return c.ErrJSON(w, "读取错误", err)
}
ret := map[string]any{}
ret["where"] = where
ret["pageno"] = pageno
ret["pagecount"] = pagecount
ret["count"] = mainrowcount
ret["list"] = rows
if post.Getbool("field") {
field, fshow := c.CiyDB.GetField(csql)
c.FieldAdd(&field, &fshow, 0, "_btn", "操作")
ret["fshow"] = fshow
ret["field"] = field
}
if post.Getbool("once") {
once := map[string]any{}
input := make([]map[string]any, 0)
input = append(input, map[string]any{
"form": "name",
"type": "input",
"name": "姓名",
"prop": ` style="width:8em;"`,
})
input = append(input, map[string]any{
"form": "mobile",
"type": "input",
"name": "手机号",
"prop": ` style="width:8em;"`,
})
input = append(input, map[string]any{
"form": "sex",
"type": "select",
"name": "性别",
"select": "sex",
"all": "全部",
})
input = append(input, map[string]any{
"form": "logintimes",
"type": "daterange",
"name": "登录时间",
})
input = append(input, map[string]any{
"form": "addtimes",
"type": "daterange",
"name": "注册时间",
})
once["input"] = input
csql = c.NewCiySQL("zc_depart")
csql.Column("id,upid,name,isuse")
ret["zc_depart"], _, _ = c.CiyDB.Get(csql)
csql = c.NewCiySQL("zc_role")
csql.Column("id,name")
ret["zc_role"], _, _ = c.CiyDB.Get(csql)
ret["once"] = once
}
return c.SuccJSON(w, r, ret)
}
func Admin_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
id := post.Getint("id")
name := post.Get("name")
if name == "" {
return c.ErrJSON(w, "请填写姓名")
}
stpstatus := post.Getint("stpstatus")
if stpstatus <= 0 {
return c.ErrJSON(w, "请填写状态")
}
mobile := post.Get("mobile")
if mobile == "" {
return c.ErrJSON(w, "请填写手机号")
}
sex := post.Getint("sex")
if sex <= 0 {
return c.ErrJSON(w, "请填写性别")
}
departid := post.Getint("departid")
icon := post.Get("icon")
roleid := post.Getint("roleid")
var err error
var datarow map[string]any
if id > 0 {
if admin.Nopower(c.CiyDB, userid, "p500u") {
return c.ErrJSON(w, "您未被授权操作修改")
}
csql := c.NewCiySQL("zc_admin")
csql.Where("id", id)
datarow, err = c.CiyDB.Getone(csql)
if datarow == nil {
return c.ErrJSON(w, "数据不存在", err)
}
if c.Toint(datarow["roleid"]) != roleid {
if admin.Nopower(c.CiyDB, userid, "p500r") {
return c.ErrJSON(w, "您没有赋予角色的权限")
}
} else {
roleid = 0
}
} else {
if admin.Nopower(c.CiyDB, userid, "p500a") {
return c.ErrJSON(w, "您未被授权操作新增")
}
if admin.Nopower(c.CiyDB, userid, "p500r") {
roleid = 0
}
}
rolerow := map[string]any{}
if roleid > 0 {
csql := c.NewCiySQL("zc_role")
csql.Where("id", roleid)
rolerow, err := c.CiyDB.Getone(csql)
if rolerow == nil {
return c.ErrJSON(w, "角色不存在", err)
}
}
updata := map[string]any{}
err = c.CiyDB.Tran(func() error {
var csql *c.CiySQL
csql = c.NewCiySQL("zc_admin")
csql.Where("mobile", mobile)
csql.Column("id")
chkid := c.Toint(c.CiyDB.Get1(csql))
if chkid > 0 && ((id > 0 && chkid != id) || id == 0) {
return fmt.Errorf("数据已存在")
}
updata["icon"] = icon
updata["name"] = name
updata["stpstatus"] = stpstatus
updata["mobile"] = mobile
updata["sex"] = sex
updata["departid"] = departid
updata["roleid"] = roleid
if roleid > 0 {
updata["power"] = rolerow["power"]
}
csql = c.NewCiySQL("zc_admin")
if id > 0 {
csql.Where("id", id)
_, err = c.CiyDB.Update(csql, updata)
if stpstatus == 10 {
if roleid > 0 || datarow["name"] != name || datarow["icon"] != icon {
c.CiyDB.Execute("update zc_online set usrchg=2 where user=?", id)
}
} else {
c.CiyDB.Execute("delete from zc_online where user=?", id)
}
if datarow["name"] != name {
c.CiyDB.Execute("update zc_online set usrchg=2")
}
} else {
updata["addtimes"] = c.Tostamp()
id, err = c.CiyDB.Insert(csql, updata)
c.CiyDB.Execute("update zc_online set usrchg=2")
}
updata["id"] = id
if err != nil {
return fmt.Errorf("更新失败:%v", err)
}
admin.SaveLogDB(c.CiyDB, "zc_admin", datarow, updata)
return nil
})
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, r, ret)
}
func Admin_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p500d") {
return c.ErrJSON(w, "您未被授权操作")
}
ids := post.Get("ids")
if ids == "" {
return c.ErrJSON(w, "请选择至少一条")
}
csql := c.NewCiySQL("zc_admin")
csql.Where("id in", ids)
rows, _, err := c.CiyDB.Get(csql)
if err != nil {
return c.ErrJSON(w, "读取数据错误", err)
}
vids := make([]int, 0)
err = c.CiyDB.Tran(func() error {
for _, row := range rows {
delid := c.Toint(row["id"])
if userid == delid {
return fmt.Errorf("不能删除本人")
}
if delid == 10 {
return fmt.Errorf("不能删除超级管理员")
}
c.Delme(c.CiyDB, delid, "zc_admin")
c.CiyDB.Execute("delete from zc_online where user=?", delid)
admin.SaveLogDB(c.CiyDB, "zc_admin", row, nil)
vids = append(vids, delid)
}
return nil
})
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
c.CiyDB.Execute("update zc_online set usrchg=2")
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, r, ret)
}
func Admin_repass(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p500p") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")
err := c.CiyDB.Tran(func() error {
updata := map[string]any{}
updata["trytime"] = 0
updata["password"] = c.Sha256(admin.Gdefpass + admin.Gtokensalt)
csql := c.NewCiySQL("zc_admin")
csql.Where("id", id)
_, err := c.CiyDB.Update(csql, updata)
if err != nil {
return fmt.Errorf("更新失败:%v", err)
}
return nil
})
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
c.CiyDB.Execute("delete from zc_online where user=?", id)
ret := map[string]any{}
ret["msg"] = "默认密码: " + admin.Gdefpass
return c.SuccJSON(w, r, ret)
}
func Admin_exportxls(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p500e") {
return c.ErrJSON(w, "您未被授权操作")
}
_, csql := admin_setwhere(post)
rows, _, err := c.CiyDB.Get(csql)
if err != nil {
return c.ErrJSON(w, "读取错误", err)
}
if len(rows) > 10000 {
return c.ErrJSON(w, "将导出"+c.Tostr(len(rows))+"条不建议超过1万条请筛选缩小范围", err)
}
fields := []map[string]string{}
fields = append(fields, map[string]string{"style": "c", "width": "60", "field": "id", "name": "行码"})
fields = append(fields, map[string]string{"style": "l", "width": "100", "field": "name", "name": "姓名"})
fields = append(fields, map[string]string{"style": "c", "width": "60", "field": "stpstatus", "name": "状态"})
fields = append(fields, map[string]string{"style": "l", "width": "100", "field": "mobile", "name": "手机号"})
fields = append(fields, map[string]string{"style": "c", "width": "60", "field": "sex", "name": "性别"})
fields = append(fields, map[string]string{"style": "l", "width": "100", "field": "departid", "name": "所属组织"})
fields = append(fields, map[string]string{"style": "l", "width": "100", "field": "logintimes", "name": "登录时间"})
fields = append(fields, map[string]string{"style": "l", "width": "100", "field": "addtimes", "name": "注册时间"})
code_stpstatus := admin.Getcatas(c.CiyDB, "stpstatus")
code_sex := admin.Getcatas(c.CiyDB, "sex")
csql = c.NewCiySQL("zc_depart")
csql.Column("id,upid,name")
code_departid, _, err2 := c.CiyDB.Get(csql)
if err2 != nil {
return c.ErrJSON(w, "读取zc_depart错误", err2)
}
datas := [][]string{}
for _, row := range rows {
dat := make([]string, 0)
for _, f := range fields {
field := f["field"]
if val, ok := row[field]; ok {
var str string
if field == "id" {
str = c.EnID(c.Toint(val))
} else if field == "stpstatus" {
str = c.Ccode(code_stpstatus, c.Toint(val))
} else if field == "sex" {
str = c.Ccode(code_sex, c.Toint(val))
} else if field == "departid" {
str = strings.Join(c.Mcode(code_departid, c.Toint(val)), "-")
} else if field == "logintimes" {
t := c.Toint(val)
if t <= 0 {
str = "--"
} else {
str = c.Todate(t, "Y-m-d H:i")
}
} else if field == "addtimes" {
t := c.Toint(val)
if t <= 0 {
str = "--"
} else {
str = c.Todate(t, "Y-m-d H:i")
}
} else {
str = c.Tostr(val)
}
dat = append(dat, str)
} else {
dat = append(dat, "")
}
}
datas = append(datas, dat)
}
param := map[string]any{}
param["sheetname"] = "数据报表"
param["titleheight"] = "25" //列头高度
param["landscape"] = true //横向打印
param["fixtopage"] = true //打印整个工作表
param["toptitle"] = "管理员数据报表"
total := []map[string]any{} //单行统计数据
// total = append(total, map[string]any{"style": "l", "name": "合计", "merge": 5})
// total = append(total, map[string]any{"style": "r", "name": "=SUM(R[-" + c.Tostr(len(datas)) + "]C:R[-1]C)"})
// total = append(total, map[string]any{"style": "r", "name": "=MAX(R[-" + c.Tostr(len(datas)) + "]C:R[-1]C)"})
// param["rowstop"] = `<Row ss:Height="45"><Cell ss:MergeAcross="7" ss:StyleID="cap"><Data ss:Type="String">众产Ciyon</Data></Cell></Row>`
// param["rowsfooter"] = `<Row><Cell ss:MergeAcross="2"><Data ss:Type="String" ss:StyleID="r">总计</Data></Cell><Cell ss:Formula="=SUM(R[-2]C:R[-1]C)"><Data ss:Type="Number"></Data></Cell></Row>`
str := c.General_excel_xml(fields, datas, param, total)
filename := "/ud/tmp/" + c.Todate(-1, "Ymd_His") + c.Tostr(rand.Intn(8999)+1000) + ".xls"
err = c.FileSave(c.CiyWebDir+filename, str)
if err != nil {
return c.ErrJSON(w, "导出保存文件错误:%v[%v]", err, filename)
}
ret := map[string]any{}
ret["url"] = filename
return c.SuccJSON(w, r, ret)
}
func Admin_importxls_in(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p500u") {
return c.ErrJSON(w, "您未被授权操作")
}
file := post.Get("file")
if c.FileExist(c.CiyWebDir+"/ud/"+file) != nil {
return c.ErrJSON(w, "文件不存在")
}
xlFile, err := xlsx.OpenFile(c.CiyWebDir + "/ud/" + file)
if err != nil {
return c.ErrJSON(w, "文件打开错误:%v", err)
}
datas, err := xlFile.ToSlice()
if err != nil {
return c.ErrJSON(w, "文件解析错误:%v", err)
}
datacnt := len(datas[0])
if datacnt < 2 {
return c.ErrJSON(w, "数据为空")
}
html := ""
headsn := []string{}
headsn = append(headsn, "行码.id")
headsn = append(headsn, "姓名.name")
headsn = append(headsn, "状态.stpstatus")
headsn = append(headsn, "手机号.mobile")
headsn = append(headsn, "性别.sex")
headsn = append(headsn, "所属组织.departid")
xlsidx := 1
if datas[0][0][len(headsn)-1] == "" {
xlsidx = 2
}
heads := make([]map[string]string, 0)
for _, head := range headsn {
hd := strings.Split(head, ".")
if len(hd) < 2 {
continue
}
heads = append(heads, map[string]string{
"idx": c.Tostr(c.In_array(datas[0][xlsidx-1], hd[0])),
"fld": hd[1],
"name": hd[0],
})
}
code_sex := admin.Getcatas(c.CiyDB, "sex")
code_departid, _, _ := c.CiyDB.Get(c.NewCiySQL("zc_depart").Where("isuse", 1).Column("id,upid,name"))
code_stpstatus := admin.Getcatas(c.CiyDB, "stpstatus")
html += "<div class=\"table\">\n"
html += "<table><thead><tr>\n"
html += "<th>#</th>\n"
for _, arr := range heads {
html += "<th>" + arr["name"] + "</th>\n"
}
html += "</tr>\n"
cnt := 0
un_name := []string{}
un_mobile := []string{}
id := 0
for rowidx := xlsidx; rowidx < datacnt; rowidx++ {
lineidx := c.Tostr(rowidx - xlsidx + 1)
hrhtml := ""
firsthtml := "<td><div>" + lineidx + "</div></td>"
bempty := true
for _, arr := range heads {
name := arr["name"]
errmsg := "" //数据有误,显示红色说明
showdat := "" //显示在表格中的数据
if c.Toint(arr["idx"]) > -1 {
showdat = strings.TrimSpace(datas[0][rowidx][c.Toint(arr["idx"])])
}
if showdat == "--" {
showdat = ""
}
var value any
value = showdat //在表单中的数据(转换后)
ext := "" //扩展表单
if name == "行码" {
if showdat == "" {
value = 0
showdat = "<kbd>新增</kbd>"
} else {
id = c.DeID(showdat)
if id == 0 {
errmsg = name + "解析错误"
} else {
csqlchk := c.NewCiySQL("zc_admin")
csqlchk.Where("id", id).Column("id")
chkid := c.Toint(c.CiyDB.Get1(csqlchk))
if chkid != id {
errmsg = name + "在数据库中不存在"
}
value = id
}
}
} else if name == "状态" {
if showdat == "" {
value = 0
} else {
value = c.Dcode(code_stpstatus, c.Tostr(showdat))
if value == -1 {
errmsg = name + "文字与系统数据不匹配"
}
}
} else if name == "性别" {
if showdat == "" {
value = 0
} else {
value = c.Dcode(code_sex, c.Tostr(showdat))
if value == -1 {
errmsg = name + "文字与系统数据不匹配"
}
}
} else if name == "姓名" {
if showdat == "" {
errmsg = name + "为必填项"
} else {
csqlchk := c.NewCiySQL("zc_admin")
csqlchk.Where("name", id).Column("id")
chkid := c.Toint(c.CiyDB.Get1(csqlchk))
if chkid > 0 && ((id > 0 && chkid != id) || id == 0) {
errmsg = name + "在数据库中出现重复"
}
if c.In_array(un_name, showdat) > -1 {
errmsg = name + "发现重复"
} else {
un_name = append(un_name, showdat)
}
}
} else if name == "手机号" {
if showdat == "" {
errmsg = name + "为必填项"
} else {
csqlchk := c.NewCiySQL("zc_admin")
csqlchk.Where("mobile", id).Column("id")
chkid := c.Toint(c.CiyDB.Get1(csqlchk))
if chkid > 0 && ((id > 0 && chkid != id) || id == 0) {
errmsg = name + "在数据库中出现重复"
}
if c.In_array(un_mobile, showdat) > -1 {
errmsg = name + "发现重复"
} else {
un_mobile = append(un_mobile, showdat)
}
}
} else if name == "所属组织" {
if showdat == "" {
value = 0
} else {
dats := strings.Split(showdat, "-")
value = c.Dcode(code_departid, dats[len(dats)-1])
if value == -1 {
errmsg = name + "文字与系统数据不匹配"
}
}
}
if showdat != "" {
bempty = false
}
if errmsg == "" {
hrhtml += "<td><div>" + showdat + "<input type=\"hidden\" name=\"" + c.Tostr(arr["fld"]) + "_" + lineidx + "\" value=\"" + c.Tostr(value) + "\"/>" + ext + "</div></td>"
} else {
hrhtml += "<td><div style=\"background:#ffe8c5;\" title=\"#" + lineidx + ":" + errmsg + "\">" + showdat + "</div></td>"
}
}
if bempty {
continue
}
html += "<tr>"
html += firsthtml
html += hrhtml
html += "</tr>"
cnt++
}
html += "</tbody>\n"
html += "</table>\n"
html += "</div>\n"
html += "<input type=\"hidden\" name=\"total\" value=\"" + c.Tostr(cnt) + "\"/>\n"
html += "<code>共" + c.Tostr(cnt) + "条数据</code>\n"
return c.SuccJSON(w, r, map[string]any{
"html": html,
"count": cnt,
})
}
func Admin_importxls_data(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p500a") {
return c.ErrJSON(w, "您未被授权操作新增")
}
total := post.Getint("total")
err := c.CiyDB.Tran(func() error {
for i := 1; i <= total; i++ {
istr := c.Tostr(i)
id := post.Getint("id_" + istr)
stpstatus := post.Getint("stpstatus_" + istr)
name := post.Get("name_" + istr)
mobile := post.Get("mobile_" + istr)
sex := post.Getint("sex_" + istr)
departid := post.Getint("departid_" + istr)
csql := c.NewCiySQL("zc_admin")
csql.Where("mobile", mobile)
csql.Column("id")
chkid := c.Toint(c.CiyDB.Get1(csql))
if chkid > 0 && ((id > 0 && chkid != id) || id == 0) {
return fmt.Errorf("发现手机号有重复")
}
updata := map[string]any{}
updata["name"] = name
updata["mobile"] = mobile
updata["stpstatus"] = stpstatus
updata["sex"] = sex
updata["departid"] = departid
csql = c.NewCiySQL("zc_admin")
var err error
if id == 0 {
updata["addtimes"] = c.Tostamp()
_, err = c.CiyDB.Insert(csql, updata)
} else {
csql.Where("id", id)
_, err = c.CiyDB.Update(csql, updata)
}
if err != nil {
return fmt.Errorf("导入失败:%v", err)
}
}
return nil
})
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
c.CiyDB.Execute("update zc_online set usrchg=2")
return c.SuccJSON(w, r)
}