#5 -- Add variables and terms to db
All checks were successful
CI fuzzy controller / container-test-job (push) Successful in 1m2s

This commit is contained in:
Anton Romanov 2025-02-19 17:02:37 +04:00
parent 11fc4e46d1
commit 3723881909
27 changed files with 413 additions and 245 deletions

View File

@ -4,7 +4,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;

View File

@ -12,6 +12,7 @@ import ru.ulstu.fc.project.model.Project;
import ru.ulstu.fc.project.model.ProjectForm; import ru.ulstu.fc.project.model.ProjectForm;
import ru.ulstu.fc.project.service.ProjectRulesService; import ru.ulstu.fc.project.service.ProjectRulesService;
import ru.ulstu.fc.project.service.ProjectService; import ru.ulstu.fc.project.service.ProjectService;
import ru.ulstu.fc.project.service.ProjectVariableService;
import ru.ulstu.fc.user.model.UserRoleConstants; import ru.ulstu.fc.user.model.UserRoleConstants;
@Controller @Controller
@ -21,11 +22,14 @@ import ru.ulstu.fc.user.model.UserRoleConstants;
public class ProjectController { public class ProjectController {
private final ProjectService projectService; private final ProjectService projectService;
private final ProjectRulesService projectRulesService; private final ProjectRulesService projectRulesService;
private final ProjectVariableService projectVariableService;
public ProjectController(ProjectService projectService, public ProjectController(ProjectService projectService,
ProjectRulesService projectRulesService) { ProjectRulesService projectRulesService,
ProjectVariableService projectVariableService) {
this.projectService = projectService; this.projectService = projectService;
this.projectRulesService = projectRulesService; this.projectRulesService = projectRulesService;
this.projectVariableService = projectVariableService;
} }
@GetMapping("list") @GetMapping("list")
@ -42,6 +46,7 @@ public class ProjectController {
: new Project())); : new Project()));
model.addAttribute("rules", projectRulesService.getByProjectId(id)); model.addAttribute("rules", projectRulesService.getByProjectId(id));
model.addAttribute("variables", projectVariableService.getByProjectId(id));
return "project/edit"; return "project/edit";
} }

View File

@ -5,15 +5,15 @@ import java.util.List;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.repository.RuleRepository; import ru.ulstu.fc.rule.repository.FuzzyRuleRepository;
import ru.ulstu.fc.rule.model.FuzzyRule; import ru.ulstu.fc.rule.model.FuzzyRule;
@Service @Service
public class ProjectRulesService { public class ProjectRulesService {
private final RuleRepository ruleRepository; private final FuzzyRuleRepository ruleRepository;
private final ProjectService projectService; private final ProjectService projectService;
public ProjectRulesService(RuleRepository ruleRepository, public ProjectRulesService(FuzzyRuleRepository ruleRepository,
ProjectService projectService) { ProjectService projectService) {
this.ruleRepository = ruleRepository; this.ruleRepository = ruleRepository;
this.projectService = projectService; this.projectService = projectService;

View File

@ -0,0 +1,28 @@
package ru.ulstu.fc.project.service;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.repository.VariableRepository;
import ru.ulstu.fc.rule.model.Variable;
@Service
public class ProjectVariableService {
private final VariableRepository variableRepository;
private final ProjectService projectService;
public ProjectVariableService(VariableRepository variableRepository,
ProjectService projectService) {
this.variableRepository = variableRepository;
this.projectService = projectService;
}
public List<Variable> getByProjectId(Integer projectId) {
if (projectId == null || projectId == 0) {
return Collections.emptyList();
}
return variableRepository.findByProject(projectService.getById(projectId));
}
}

View File

@ -7,10 +7,9 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import ru.ulstu.fc.rule.model.Antecedent;
import ru.ulstu.fc.rule.model.InferenceForm; import ru.ulstu.fc.rule.model.InferenceForm;
import ru.ulstu.fc.rule.model.Term;
import ru.ulstu.fc.rule.model.Variable; import ru.ulstu.fc.rule.model.Variable;
import ru.ulstu.fc.rule.model.VariableValue;
import ru.ulstu.fc.rule.service.FuzzyInferenceService; import ru.ulstu.fc.rule.service.FuzzyInferenceService;
import java.util.Arrays; import java.util.Arrays;
@ -45,21 +44,21 @@ public class InferenceMvcController {
return "index"; return "index";
} }
private List<VariableValue> getAgeValues() { private List<Term> getAgeValues() {
Variable var = new Variable("Age"); Variable var = new Variable("Age");
var.getValues().addAll(Arrays.asList( var.getTerms().addAll(Arrays.asList(
new VariableValue("молодой", 30.0), new Term("молодой", 30.0),
new VariableValue("средний", 45.0), new Term("средний", 45.0),
new VariableValue("старый", 60.0))); new Term("старый", 60.0)));
return var.getValues(); return var.getTerms();
} }
private List<VariableValue> getIncomeValues() { private List<Term> getIncomeValues() {
Variable var = new Variable("Income"); Variable var = new Variable("Income");
var.getValues().addAll(Arrays.asList( var.getTerms().addAll(Arrays.asList(
new VariableValue("небольшой", 20000.0), new Term("небольшой", 20000.0),
new VariableValue("средний", 90000.0), new Term("средний", 90000.0),
new VariableValue("высокий", 200000.0))); new Term("высокий", 200000.0)));
return var.getValues(); return var.getTerms();
} }
} }

View File

@ -7,16 +7,15 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import ru.ulstu.fc.rule.model.FuzzyRule; import ru.ulstu.fc.rule.model.VariableForm;
import ru.ulstu.fc.rule.model.RuleForm; import ru.ulstu.fc.rule.service.VariableService;
import ru.ulstu.fc.rule.service.RuleService;
@Controller @Controller
@RequestMapping("rule") @RequestMapping("rule")
public class RuleController { public class RuleController {
private final RuleService ruleService; private final VariableService ruleService;
public RuleController(RuleService ruleService) { public RuleController(VariableService ruleService) {
this.ruleService = ruleService; this.ruleService = ruleService;
} }
@ -25,7 +24,7 @@ public class RuleController {
@PathVariable(value = "ruleId") Integer id, Model model) { @PathVariable(value = "ruleId") Integer id, Model model) {
model.addAttribute("projectId", projectId); model.addAttribute("projectId", projectId);
model.addAttribute("rule", model.addAttribute("rule",
new RuleForm(id, (id != null && id != 0) new VariableForm(id, (id != null && id != 0)
? ruleService.getById(id).getProject().getId() ? ruleService.getById(id).getProject().getId()
: projectId)); : projectId));
@ -33,13 +32,13 @@ public class RuleController {
} }
@PostMapping(value = "save", params = "save") @PostMapping(value = "save", params = "save")
public String save(RuleForm ruleForm, Model model) { public String save(VariableForm ruleForm, Model model) {
model.addAttribute("rule", ruleService.save(ruleForm)); model.addAttribute("rule", ruleService.save(ruleForm));
return "redirect:/project/edit/" + ruleForm.getProjectId(); return "redirect:/project/edit/" + ruleForm.getProjectId();
} }
@PostMapping(value = "save", params = "delete") @PostMapping(value = "save", params = "delete")
public String delete(RuleForm ruleForm) { public String delete(VariableForm ruleForm) {
if (ruleForm != null && ruleForm.getId() != null) { if (ruleForm != null && ruleForm.getId() != null) {
ruleService.delete(ruleForm); ruleService.delete(ruleForm);
} }

View File

@ -0,0 +1,47 @@
package ru.ulstu.fc.rule.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import ru.ulstu.fc.rule.model.VariableForm;
import ru.ulstu.fc.rule.service.VariableService;
@Controller
@RequestMapping("var")
public class VariableController {
private final VariableService variableService;
public VariableController(VariableService variableService) {
this.variableService = variableService;
}
@GetMapping("/edit/{projectId}/{varId}")
public String edit(@PathVariable(value = "projectId") Integer projectId,
@PathVariable(value = "varId") Integer id, Model model) {
model.addAttribute("projectId", projectId);
model.addAttribute("var",
new VariableForm(id, (id != null && id != 0)
? variableService.getById(id).getProject().getId()
: projectId));
return "var/edit";
}
@PostMapping(value = "save", params = "save")
public String save(VariableForm variableForm, Model model) {
model.addAttribute("rule", variableService.save(variableForm));
return "redirect:/project/edit/" + variableForm.getProjectId();
}
@PostMapping(value = "save", params = "delete")
public String delete(VariableForm variableForm) {
if (variableForm != null && variableForm.getId() != null) {
variableService.delete(variableForm);
}
return "redirect:/project/edit/" + variableForm.getProjectId();
}
}

View File

@ -1,27 +0,0 @@
package ru.ulstu.fc.rule.model;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import ru.ulstu.fc.core.model.BaseEntity;
public class Antecedent extends BaseEntity {
@ManyToOne
private Variable variable;
@ManyToOne
private Term term;
public Variable getVariable() {
return variable;
}
public void setVariable(Variable variable) {
this.variable = variable;
}
public Term getTerm() {
return term;
}
public void setTerm(Term term) {
this.term = term;
}
}

View File

@ -1,29 +0,0 @@
package ru.ulstu.fc.rule.model;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import ru.ulstu.fc.core.model.BaseEntity;
public class Consequent extends BaseEntity {
@ManyToOne
private Variable variable;
private String value;
public Variable getVariable() {
return variable;
}
public void setVariable(Variable variable) {
this.variable = variable;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -1,14 +1,14 @@
package ru.ulstu.fc.rule.model; package ru.ulstu.fc.rule.model;
public class RuleForm { public class FuzzyRuleForm {
private Integer id; private Integer id;
private Integer projectId; private Integer projectId;
private String content; private String content;
public RuleForm() { public FuzzyRuleForm() {
} }
public RuleForm(Integer id, Integer projectId) { public FuzzyRuleForm(Integer id, Integer projectId) {
this.id = id; this.id = id;
this.projectId = projectId; this.projectId = projectId;
} }

View File

@ -3,8 +3,18 @@ package ru.ulstu.fc.rule.model;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import ru.ulstu.fc.core.model.BaseEntity; import ru.ulstu.fc.core.model.BaseEntity;
@Entity
public class Term extends BaseEntity { public class Term extends BaseEntity {
private String description; private String description;
private Double value;
public Term() {
}
public Term(String description, Double value) {
this.description = description;
this.value = value;
}
public String getDescription() { public String getDescription() {
return description; return description;
@ -13,4 +23,13 @@ public class Term extends BaseEntity {
public void setDescription(String description) { public void setDescription(String description) {
this.description = description; this.description = description;
} }
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
} }

View File

@ -6,29 +6,57 @@ import java.util.List;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.OneToMany; import jakarta.persistence.OneToMany;
import ru.ulstu.fc.core.model.BaseEntity; import ru.ulstu.fc.core.model.BaseEntity;
import ru.ulstu.fc.project.model.Project;
@Entity
public class Variable extends BaseEntity { public class Variable extends BaseEntity {
private String name; private String name;
private Project project;
private boolean isInput;
@OneToMany @OneToMany
private List<VariableValue> values = new ArrayList<>(); private List<Term> terms = new ArrayList<>();
public Variable() { public Variable() {
} }
public Variable(String name, List<VariableValue> values) {
this.name = name;
this.values = values;
}
public Variable(String name) { public Variable(String name) {
this.name = name; this.name = name;
} }
public Variable(String name, List<Term> terms) {
this.name = name;
this.terms = terms;
}
public String getName() { public String getName() {
return name; return name;
} }
public List<VariableValue> getValues() { public void setName(String name) {
return values; this.name = name;
}
public List<Term> getTerms() {
return terms;
}
public void setTerms(List<Term> terms) {
this.terms = terms;
}
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
public boolean isInput() {
return isInput;
}
public void setInput(boolean isInput) {
this.isInput = isInput;
} }
} }

View File

@ -0,0 +1,40 @@
package ru.ulstu.fc.rule.model;
public class VariableForm {
private Integer id;
private Integer projectId;
private String name;
public VariableForm() {
}
public VariableForm(Integer id, Integer projectId) {
this.id = id;
this.projectId = projectId;
}
public Integer getProjectId() {
return projectId;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void setProjectId(Integer projectId) {
this.projectId = projectId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -1,33 +0,0 @@
package ru.ulstu.fc.rule.model;
import jakarta.persistence.Entity;
import ru.ulstu.fc.core.model.BaseEntity;
public class VariableValue extends BaseEntity {
private String fuzzyTerm;
private Double value;
public VariableValue() {
}
public VariableValue(String fuzzyTerm, Double value) {
this.fuzzyTerm = fuzzyTerm;
this.value = value;
}
public String getFuzzyTerm() {
return fuzzyTerm;
}
public void setFuzzyTerm(String fuzzyTerm) {
this.fuzzyTerm = fuzzyTerm;
}
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
}

View File

@ -7,7 +7,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import ru.ulstu.fc.project.model.Project; import ru.ulstu.fc.project.model.Project;
import ru.ulstu.fc.rule.model.FuzzyRule; import ru.ulstu.fc.rule.model.FuzzyRule;
public interface RuleRepository extends JpaRepository<FuzzyRule, Integer> { public interface FuzzyRuleRepository extends JpaRepository<FuzzyRule, Integer> {
List<FuzzyRule> findByProject(Project project); List<FuzzyRule> findByProject(Project project);
} }

View File

@ -0,0 +1,13 @@
package ru.ulstu.fc.rule.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import ru.ulstu.fc.project.model.Project;
import ru.ulstu.fc.rule.model.Variable;
public interface VariableRepository extends JpaRepository<Variable, Integer> {
List<Variable> findByProject(Project project);
}

View File

@ -15,8 +15,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.model.OutputValue; import ru.ulstu.fc.rule.model.OutputValue;
import ru.ulstu.fc.rule.model.Term;
import ru.ulstu.fc.rule.model.Variable; import ru.ulstu.fc.rule.model.Variable;
import ru.ulstu.fc.rule.model.VariableValue;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -45,15 +45,15 @@ public class FuzzyInferenceService {
final InputVariable input = new InputVariable(); final InputVariable input = new InputVariable();
input.setName(variable.getName()); input.setName(variable.getName());
input.setDescription(""); input.setDescription("");
input.setRange(0, variable.getValues().get(variable.getValues().size() - 1).getValue()); input.setRange(0, variable.getTerms().get(variable.getTerms().size() - 1).getValue());
input.setEnabled(true); input.setEnabled(true);
input.setLockValueInRange(false); input.setLockValueInRange(false);
double prev = 0; double prev = 0;
for (int i = 0; i < variable.getValues().size(); i++) { for (int i = 0; i < variable.getTerms().size(); i++) {
Triangle term = new Triangle(variable.getValues().get(i).getFuzzyTerm(), Triangle term = new Triangle(variable.getTerms().get(i).getDescription(),
prev, prev,
variable.getValues().get(i).getValue(), variable.getTerms().get(i).getValue(),
variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev); variable.getTerms().get(i).getValue() + variable.getTerms().get(i).getValue() - prev);
prev = term.getVertexB(); prev = term.getVertexB();
input.addTerm(term); input.addTerm(term);
} }
@ -64,19 +64,19 @@ public class FuzzyInferenceService {
final OutputVariable output = new OutputVariable(); final OutputVariable output = new OutputVariable();
output.setName(variable.getName()); output.setName(variable.getName());
output.setDescription(""); output.setDescription("");
output.setRange(0, variable.getValues().get(variable.getValues().size() - 1).getValue()); output.setRange(0, variable.getTerms().get(variable.getTerms().size() - 1).getValue());
output.setEnabled(true); output.setEnabled(true);
output.setAggregation(new Maximum()); output.setAggregation(new Maximum());
output.setDefuzzifier(new WeightedAverage()); output.setDefuzzifier(new WeightedAverage());
output.setDefaultValue(Double.NaN); output.setDefaultValue(Double.NaN);
output.setLockValueInRange(false); output.setLockValueInRange(false);
double prev = 0; double prev = 0;
for (int i = 0; i < variable.getValues().size(); i++) { for (int i = 0; i < variable.getTerms().size(); i++) {
Triangle term = new Triangle( Triangle term = new Triangle(
variable.getValues().get(i).getFuzzyTerm(), variable.getTerms().get(i).getDescription(),
prev, prev,
variable.getValues().get(i).getValue(), variable.getTerms().get(i).getValue(),
variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev); variable.getTerms().get(i).getValue() + variable.getTerms().get(i).getValue() - prev);
prev = term.getVertexB(); prev = term.getVertexB();
output.addTerm(term); output.addTerm(term);
} }
@ -131,20 +131,20 @@ public class FuzzyInferenceService {
public List<OutputValue> getFuzzyInference(Map<String, Double> vals) { public List<OutputValue> getFuzzyInference(Map<String, Double> vals) {
return getFuzzyInference(getDemoRules(), vals, return getFuzzyInference(getDemoRules(), vals,
List.of(new Variable("возраст", List.of( List.of(new Variable("возраст", List.of(
new VariableValue("молодой", 35.0), new Term("молодой", 35.0),
new VariableValue("средний", 60.0), new Term("средний", 60.0),
new VariableValue("старый", 100.0)) new Term("старый", 100.0))
), ),
new Variable("доход", List.of( new Variable("доход", List.of(
new VariableValue("небольшой", 35000.0), new Term("небольшой", 35000.0),
new VariableValue("средний", 100000.0), new Term("средний", 100000.0),
new VariableValue("высокий", 500000.0)) new Term("высокий", 500000.0))
) )
), ),
new Variable("кредит", List.of( new Variable("кредит", List.of(
new VariableValue("небольшой", 20000.0), new Term("небольшой", 20000.0),
new VariableValue("средний", 100000.0), new Term("средний", 100000.0),
new VariableValue("большой", 1000000.0))) new Term("большой", 1000000.0)))
); );
} }

View File

@ -0,0 +1,42 @@
package ru.ulstu.fc.rule.service;
import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.repository.FuzzyRuleRepository;
import ru.ulstu.fc.project.service.ProjectService;
import ru.ulstu.fc.rule.model.FuzzyRule;
import ru.ulstu.fc.rule.model.FuzzyRuleForm;
@Service
public class FuzzyRuleService {
private final FuzzyRuleRepository ruleRepository;
private final ProjectService projectService;
public FuzzyRuleService(FuzzyRuleRepository ruleRepository, ProjectService projectService) {
this.ruleRepository = ruleRepository;
this.projectService = projectService;
}
public FuzzyRule getById(Integer id) {
return ruleRepository
.findById(id)
.orElseThrow(() -> new RuntimeException("Rule not found by id"));
}
public Object save(FuzzyRuleForm ruleForm) {
FuzzyRule rule;
if (ruleForm.getId() == null || ruleForm.getId() == 0) {
rule = new FuzzyRule();
} else {
rule = getById(ruleForm.getId());
}
rule.setProject(projectService.getById(ruleForm.getProjectId()));
rule.setContent(ruleForm.getContent());
return ruleRepository.save(rule);
}
public void delete(FuzzyRuleForm ruleForm) {
getById(ruleForm.getId());
ruleRepository.deleteById(ruleForm.getId());
}
}

View File

@ -1,43 +0,0 @@
package ru.ulstu.fc.rule.service;
import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.repository.RuleRepository;
import ru.ulstu.fc.project.service.ProjectService;
import ru.ulstu.fc.rule.model.FuzzyRule;
import ru.ulstu.fc.rule.model.RuleForm;
@Service
public class RuleService {
private final RuleRepository ruleRepository;
private final ProjectService projectService;
public RuleService(RuleRepository ruleRepository, ProjectService projectService) {
this.ruleRepository = ruleRepository;
this.projectService = projectService;
}
public FuzzyRule getById(Integer id) {
return ruleRepository
.findById(id)
.orElseThrow(() -> new RuntimeException("Rule not found by id"));
}
public Object save(RuleForm ruleForm) {
if (ruleForm.getId() == null || ruleForm.getId() == 0) {
FuzzyRule rule = new FuzzyRule();
rule.setProject(projectService.getById(ruleForm.getProjectId()));
rule.setContent(ruleForm.getContent());
return ruleRepository.save(rule);
}
FuzzyRule dbRule = getById(ruleForm.getId());
dbRule.setProject(projectService.getById(ruleForm.getProjectId()));
dbRule.setContent(ruleForm.getContent());
return ruleRepository.save(dbRule);
}
public void delete(RuleForm ruleForm) {
getById(ruleForm.getId());
ruleRepository.deleteById(ruleForm.getId());
}
}

View File

@ -0,0 +1,42 @@
package ru.ulstu.fc.rule.service;
import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.repository.VariableRepository;
import ru.ulstu.fc.project.service.ProjectService;
import ru.ulstu.fc.rule.model.Variable;
import ru.ulstu.fc.rule.model.VariableForm;
@Service
public class VariableService {
private final VariableRepository variableRepository;
private final ProjectService projectService;
public VariableService(VariableRepository variableRepository, ProjectService projectService) {
this.variableRepository = variableRepository;
this.projectService = projectService;
}
public Variable getById(Integer id) {
return variableRepository
.findById(id)
.orElseThrow(() -> new RuntimeException("Variable not found by id"));
}
public Object save(VariableForm variableForm) {
Variable variable;
if (variableForm.getId() == null || variableForm.getId() == 0) {
variable = new Variable();
} else {
variable = getById(variableForm.getId());
}
variable.setProject(projectService.getById(variableForm.getProjectId()));
variable.setName(variableForm.getName());
return variableRepository.save(variable);
}
public void delete(VariableForm ruleForm) {
getById(ruleForm.getId());
variableRepository.deleteById(ruleForm.getId());
}
}

View File

@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.context.request.WebRequest; import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;

View File

@ -1,21 +1,20 @@
package ru.ulstu.fc.user.model; package ru.ulstu.fc.user.model;
import java.util.HashSet;
import java.util.Set;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable; import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToMany;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import ru.ulstu.fc.config.Constants; import ru.ulstu.fc.config.Constants;
import ru.ulstu.fc.core.model.BaseEntity; import ru.ulstu.fc.core.model.BaseEntity;
import java.util.HashSet;
import java.util.Set;
@Entity @Entity
@Table(name = "is_users") @Table(name = "is_users")
public class User extends BaseEntity { public class User extends BaseEntity {

View File

@ -1,19 +1,18 @@
package ru.ulstu.fc.user.service; package ru.ulstu.fc.user.service;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;
public final class IpAddressResolver { public final class IpAddressResolver {
private static final String CLIENT_IP_HEADER = "Client-IP"; //private static final String CLIENT_IP_HEADER = "Client-IP";
private static final String FORWARDED_FOR_HEADER = "X-Forwarded-For"; //private static final String FORWARDED_FOR_HEADER = "X-Forwarded-For";
public static String getRemoteAddr(HttpServletRequest request) { public static String getRemoteAddr(HttpServletRequest request) {
String headerClientIp = request.getHeader(""); String headerClientIp = request.getHeader("");
String headerXForwardedFor = request.getHeader(HttpServletRequest.FORM_AUTH); String headerXForwardedFor = request.getHeader(HttpServletRequest.FORM_AUTH);
if (StringUtils.isEmpty(request.getRemoteAddr()) && !StringUtils.isEmpty(headerClientIp)) { if (request.getRemoteAddr().isEmpty() && !headerClientIp.isEmpty()) {
return headerClientIp; return headerClientIp;
} }
if (!StringUtils.isEmpty(headerXForwardedFor)) { if (!headerXForwardedFor.isEmpty()) {
return headerXForwardedFor; return headerXForwardedFor;
} }
return request.getRemoteAddr(); return request.getRemoteAddr();

View File

@ -1,21 +1,21 @@
package ru.ulstu.fc.user.service; package ru.ulstu.fc.user.service;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import ru.ulstu.fc.config.Constants; import ru.ulstu.fc.config.Constants;
import java.io.IOException;
@Component @Component
public class UserSessionLoginHandler extends SavedRequestAwareAuthenticationSuccessHandler implements AuthenticationSuccessHandler { public class UserSessionLoginHandler extends SavedRequestAwareAuthenticationSuccessHandler {
private final Logger log = LoggerFactory.getLogger(UserSessionLoginHandler.class); private final Logger log = LoggerFactory.getLogger(UserSessionLoginHandler.class);
private final UserSessionService userSessionService; private final UserSessionService userSessionService;

View File

@ -1,21 +1,21 @@
package ru.ulstu.fc.user.service; package ru.ulstu.fc.user.service;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
import org.springframework.stereotype.Component;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
import org.springframework.stereotype.Component;
import ru.ulstu.fc.config.Constants; import ru.ulstu.fc.config.Constants;
import java.io.IOException;
@Component @Component
public class UserSessionLogoutHandler extends SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler { public class UserSessionLogoutHandler extends SimpleUrlLogoutSuccessHandler {
private final Logger log = LoggerFactory.getLogger(UserSessionLogoutHandler.class); private final Logger log = LoggerFactory.getLogger(UserSessionLogoutHandler.class);
private final UserSessionService userSessionService; private final UserSessionService userSessionService;

View File

@ -1,10 +1,10 @@
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd"> <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.w3.org/1999/xhtml"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.w3.org/1999/xhtml" layout:decorate="~{default}">
layout:decorate="~{default}">
<head> <head>
<title>Редактирование проекта</title> <title>Редактирование проекта</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head> </head>
<div class="container" layout:fragment="content"> <div class="container" layout:fragment="content">
<h3>Редактирование проекта:</h3> <h3>Редактирование проекта:</h3>
@ -12,14 +12,8 @@
<input type="hidden" th:field="*{id}"> <input type="hidden" th:field="*{id}">
<div class="form-group"> <div class="form-group">
<label for="name">Название</label> <label for="name">Название</label>
<input th:field="*{name}" <input th:field="*{name}" id="name" type="text" required class="form-control" placeholder="Название">
id="name" <p th:if="${#fields.hasErrors('name')}" th:class="${#fields.hasErrors('name')}? error">
type="text"
required
class="form-control"
placeholder="Название">
<p th:if="${#fields.hasErrors('name')}"
th:class="${#fields.hasErrors('name')}? error">
Не может быть пустым Не может быть пустым
</p> </p>
</div> </div>
@ -27,22 +21,30 @@
<label th:text="'Дата создания: ' + ${#dates.format(project.createDate, 'dd.MM.yyyy HH:mm')}"></label> <label th:text="'Дата создания: ' + ${#dates.format(project.createDate, 'dd.MM.yyyy HH:mm')}"></label>
</div> </div>
<button name="save" type="submit" class="btn btn-outline-dark">Сохранить</button> <button name="save" type="submit" class="btn btn-outline-dark">Сохранить</button>
<button name="delete" <button name="delete" type="submit" class="btn btn-outline-dark" onclick="return confirm('Удалить запись?')">
type="submit"
class="btn btn-outline-dark"
onclick="return confirm('Удалить запись?')">
Удалить Удалить
</button> </button>
<a href="/project/list" class="btn btn-outline-dark">Отмена</a> <a href="/project/list" class="btn btn-outline-dark">Отмена</a>
</form> </form>
<hr/> <hr />
<h4> Список правил</h4> <div class="row">
<div class="row" th:each="r, iter : ${rules}"> <div class="col col-md-6">
<div class="col col-md-12"> <h4> Список переменных</h4>
<span class="badge badge-light" th:text="${iter.index+1} + '. ' + ${r.content}"></span> <div class="row" th:each="v, iter : ${variables}">
<div class="col col-md-12">
<span class="badge badge-light" th:text="${iter.index+1} + '. ' + ${v.name}"></span>
</div>
</div>
<a th:href="@{'/var/edit/' + ${projectId}+'/0'}" class="btn btn-outline-dark">Добавить преременную</a>
</div> </div>
<!-- <div class="col col-md-2 offset-md-3"> <div class="col col-md-6">
<h4> Список правил</h4>
<div class="row" th:each="r, iter : ${rules}">
<div class="col col-md-12">
<span class="badge badge-light" th:text="${iter.index+1} + '. ' + ${r.content}"></span>
</div>
<!-- <div class="col col-md-2 offset-md-3">
<span class="badge badge-primary">Переменная</span> <span class="badge badge-primary">Переменная</span>
</div> </div>
<div class="col col-md-2"> <div class="col col-md-2">
@ -67,7 +69,9 @@
<div class="col col-md-1"> <div class="col col-md-1">
<span class="badge badge-danger">И / ИЛИ</span> <span class="badge badge-danger">И / ИЛИ</span>
</div>--> </div>-->
</div> </div>
<a th:href="@{'/rule/edit/' + ${projectId}+'/0'}" class="btn btn-outline-dark">Добавить правило</a> <a th:href="@{'/rule/edit/' + ${projectId}+'/0'}" class="btn btn-outline-dark">Добавить правило</a>
</div> </div>
</html> </div>
</html>

View File

@ -0,0 +1,38 @@
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.w3.org/1999/xhtml"
layout:decorate="~{default}">
<head>
<title>Редактирование переменной</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<div class="container" layout:fragment="content">
<h3>Редактирование переменной:</h3>
<form th:action="@{/rule/save}" th:object="${var}" method="post">
<input type="hidden" th:field="*{projectId}">
<input type="hidden" th:field="*{id}">
<div class="form-group">
<label for="name">Переменная</label>
<input th:field="*{name}"
id="name"
type="text"
required
class="form-control"
placeholder="Переменная">
<p th:if="${#fields.hasErrors('name')}"
th:class="${#fields.hasErrors('name')}? error">
Не может быть пустым
</p>
</div>
<button name="save" type="submit" class="btn btn-outline-dark">Сохранить</button>
<button name="delete"
type="submit"
class="btn btn-outline-dark"
onclick="return confirm('Удалить запись?')">
Удалить
</button>
<a th:href="@{'/project/edit/' + ${projectId}}" class="btn btn-outline-dark">Отмена</a>
</form>
</div>
</html>