当前位置: 首页 > news >正文

自助建站系wordpress 防注册

自助建站系,wordpress 防注册,新手怎么自学ps,wordpress搭建cms一、前言 在游戏中#xff0c;任务是非常常见的玩法#xff0c;可能会有主线任务#xff0c;支线任务以及其它一些类型的任务#xff0c;各任务可能还会有前置任务#xff0c;即需要完成某个任务之后#xff0c;才能做当前任务。在游戏开发中#xff0c;配置表可以使用…一、前言 在游戏中任务是非常常见的玩法可能会有主线任务支线任务以及其它一些类型的任务各任务可能还会有前置任务即需要完成某个任务之后才能做当前任务。在游戏开发中配置表可以使用Excel来编辑如果是任务表可能会是如下配置方式 TaskIDTaskTitlePreTask10任务10020任务20011任务111021任务2120 当任务比较多的时候它们的依赖关系将变得不直观很容易出错出错也不容易发现。 有没比较直观的方式进行查看排错呢笔者想到了目前非常流程的Markdown文件它可以简单地通过文本的方式输入然后输出强大的各种图表。这里就可以使用mermaid图来直观展现。 关于mermaid图可以去官网https://mermaid.js.org/intro/查看用例。 下图为生成后的效果图 #mermaid-svg-r3ZalQrJs1tDGjK7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .error-icon{fill:#552222;}#mermaid-svg-r3ZalQrJs1tDGjK7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r3ZalQrJs1tDGjK7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .marker.cross{stroke:#333333;}#mermaid-svg-r3ZalQrJs1tDGjK7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r3ZalQrJs1tDGjK7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .cluster-label text{fill:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .cluster-label span{color:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .label text,#mermaid-svg-r3ZalQrJs1tDGjK7 span{fill:#333;color:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .node rect,#mermaid-svg-r3ZalQrJs1tDGjK7 .node circle,#mermaid-svg-r3ZalQrJs1tDGjK7 .node ellipse,#mermaid-svg-r3ZalQrJs1tDGjK7 .node polygon,#mermaid-svg-r3ZalQrJs1tDGjK7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-r3ZalQrJs1tDGjK7 .node .label{text-align:center;}#mermaid-svg-r3ZalQrJs1tDGjK7 .node.clickable{cursor:pointer;}#mermaid-svg-r3ZalQrJs1tDGjK7 .arrowheadPath{fill:#333333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-r3ZalQrJs1tDGjK7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-r3ZalQrJs1tDGjK7 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-r3ZalQrJs1tDGjK7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-r3ZalQrJs1tDGjK7 .cluster text{fill:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 .cluster span{color:#333;}#mermaid-svg-r3ZalQrJs1tDGjK7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-r3ZalQrJs1tDGjK7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 0:无效任务ID 21:任务21 20:任务20 11:任务11 10:任务10 注意mermaid图在渲染时如果不设置subgraph则可能会出现乱序问题即不是按代码中出现的顺序渲染。 二、实现 为了方便Go读取Excel需要使用相关的Excel库笔者使用excelize库。 根据前面的效果图可以知道这其实就是一个深度优先的树实现方式有两种一种是使用递归的方式来实现这种方式实现起来简单但是如果层次很深那可能会出现栈溢出另一种方式就是使用栈的方式来实现将每一层节点先压栈然后从栈顶取出一个节点然后再将其所有子节点入栈再从栈顶取出一个节点处理依此类推直到栈中所有节点处理完毕。 下面列出使用递归方式实现的版本 /* MIT License# Copyright (c) 2023 WittonBellPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package mainimport (flagfmtospath/filepathstringsgithub.com/xuri/excelize/v2 )var taskIDField string var taskTitleField string var preTaskField string var noCaseSensitive bool // 是否不区分大小写 var fieldNameRow uint // 字段名所在行号 var dataStartRow uint // 数据开始行号type node struct {taskID stringtaskTitle string }type multiMap map[string][]*nodefunc (slf multiMap) Add(key string, nd *node) {if len(slf) 0 {slf[key] []*node{nd}} else {slf[key] append(slf[key], nd)} }func (slf multiMap) Get(key string) []*node {if slf nil {return nil}return slf[key] }func (slf multiMap) Del(key string) {delete(slf, key) }func searchKeyCol(rows *excelize.Rows) (TaskIDCol, PreTaskIDCol, TitleCol int) {row, err : rows.Columns()if err ! nil {fmt.Println(err.Error())}for i, col : range row {name : colif noCaseSensitive {name strings.ToLower(col)}if name preTaskField {PreTaskIDCol i 1} else if name taskIDField {TaskIDCol i 1} else if name taskTitleField {TitleCol i 1}}return }func readExcel(filePath string) multiMap {fd, err : excelize.OpenFile(filePath)if err ! nil {fmt.Printf(读取文件%s失败, filePath)return nil}defer func() {fd.Close()}()TaskIDCol, PreTaskIDCol, TitleCol : -1, -1, -1sheetName : fd.GetSheetName(0)rows, err : fd.Rows(sheetName)if err ! nil {return nil}defer func() {rows.Close()}()m : multiMap{}for i : 1; rows.Next(); i {if i int(fieldNameRow) {TaskIDCol, PreTaskIDCol, TitleCol searchKeyCol(rows)isOk : trueif TaskIDCol 0 {isOk falsefmt.Printf(要求字段名%s\n, taskIDField)}if PreTaskIDCol 0 {isOk falsefmt.Printf(要求字段名%s\n, preTaskField)}if TitleCol 0 {isOk falsefmt.Printf(要求字段名%s\n, taskTitleField)}if !isOk {return nil}}if i int(dataStartRow) {continue}TaskIDCell, err : excelize.CoordinatesToCellName(TaskIDCol, i)if err ! nil {continue}PreTaskIDCell, err : excelize.CoordinatesToCellName(PreTaskIDCol, i)if err ! nil {continue}TitleColCell, err : excelize.CoordinatesToCellName(TitleCol, i)if err ! nil {continue}TaskID, err : fd.GetCellValue(sheetName, TaskIDCell)if err ! nil || TaskID {continue}Title, err : fd.GetCellValue(sheetName, TitleColCell)if err ! nil || Title {continue}PreTaskID, err : fd.GetCellValue(sheetName, PreTaskIDCell)if err ! nil {continue}if PreTaskID {PreTaskID 0}m.Add(PreTaskID, node{taskID: TaskID, taskTitle: Title})}return m }func usage() {w : flag.CommandLine.Output()fmt.Fprintf(w, %s 应用程序是将Excel任务表中的关系转换成Markdown的mermaid图方便使用Markdown工具直观地查看任务依赖。, filepath.Base(os.Args[0]))fmt.Fprintln(w)fmt.Fprintf(w, 命令格式%s -hr [字段所在行号] -dr [数据起始行号] [-nc] -id [任务ID字段名] -t [任务标题字段名] -pid [前置任务ID字段名] -o 输出文件 Excel文件路径, filepath.Base(os.Args[0]))fmt.Fprintln(w)flag.CommandLine.PrintDefaults()fmt.Fprintln(w, -h)fmt.Fprintln(w, \t显示此帮助) }func main() {var outputFile stringflag.CommandLine.Usage usageflag.BoolVar(noCaseSensitive, nc, false, 字段名不区分大小写)flag.UintVar(fieldNameRow, hr, 1, 字段所在行号)flag.UintVar(dataStartRow, dr, 2, 数据起始行号)flag.StringVar(taskIDField, id, ID, -id [任务ID字段名])flag.StringVar(taskTitleField, t, Title, -t [任务标题字段名])flag.StringVar(preTaskField, pid, PreTask, -pid [前置任务ID字段名])flag.StringVar(outputFile, o, 任务图.md, -o 输出文件)flag.Parse()if flag.NArg() 1 {usage()return}if noCaseSensitive {taskIDField strings.ToLower(taskIDField)taskTitleField strings.ToLower(taskTitleField)preTaskField strings.ToLower(preTaskField)}mapTask : readExcel(flag.Arg(0))buildGraph(mapTask, outputFile) }func buildGraph(mapTask multiMap, outputFile string) {graph : mermaid\ngraph TB\ngraph subgraph \nroot : mapTask.Get(0)for _, v : range root {graph visit(rootNodeName, v, mapTask)}graph end\ngraph os.WriteFile(outputFile, []byte(graph), os.ModePerm)fmt.Println(完成) }func visit(parent string, nd *node, mapTask multiMap) string {slice : mapTask.Get(nd.taskID)graph : fmt.Sprintf(%s -- %s:%s\n, parent, nd.taskID, nd.taskTitle)if parent rootNodeName {graph subgraph \n}for _, x : range slice {graph visit(fmt.Sprintf(%s:%s, nd.taskID, nd.taskTitle), x, mapTask)}mapTask.Del(nd.taskID)if parent rootNodeName {graph end\n}return graph }使用栈实现的版本笔者放在excelTask2md了。
http://www.pierceye.com/news/325998/

相关文章:

  • 苏州网站建设数据网络淘宝网店怎么运营起来
  • 网站建设项目实战实训报告凡科建网站
  • 网站建设程序编制做网站优化的教程
  • 已有网站 需要整改 怎么做信息网官网
  • 中石建基础设施建设有限公司网站南阳网站建设的公司
  • 广东建设银行网站营销渠道策略
  • 廊坊开发区规划建设局网站网站域名续费一年多少钱
  • 网站建设需要哪些准备国外网站顶部菜单设计
  • 免费域名注册和免费建站深圳品牌沙发
  • php网站开发就业网站开发研究综述
  • 华升建设集团有限公司网站网站如何做那种诱导广告
  • 做资讯网站要什么手续科技设计公司网站模板下载
  • 西安互联网网站建设湘潭网站建设设计
  • 微网站开发方案模板前程无忧招聘网下载app官网
  • 网站推广方式大全如何写软文赚钱
  • 同城同镇网站建设做幼儿网站的目标
  • 上饶网站建设兼职辽宁沈阳做网站
  • 阳江企业网站好的外包公司
  • 深圳做分销商城网站我有域名跟空间能教我做网站吗
  • 网站子目录做推送用什么网站
  • 网站手机优化网站上传空间的ip地址
  • 做网站增加流量自助微信网站设计
  • 网站推广的6个方法是什么软件开发合同模板范本1
  • 营销网站手机站wordpress的主题目录
  • 达州建设企业网站重视网站商务通
  • 淘宝网站怎么做视频58做二手车网站应该怎么推广
  • 自动翻译网站软件cf刷枪网站怎么做的
  • 示范校建设验收网站网站对话窗口怎么做
  • phpcms 移动网站模板怎么做个人网页
  • 南宁手机建站公司新加坡网站后缀